🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
当多个线程共享同一个资源时,必须防止线程之间抢占资源,造成资源访问冲突,线程同步机制就是用来解决资源访问冲突的。 <br/> 如下模拟火车站售票情况,4个售票员在一起卖票(一个售票员就是一个线程),当票卖完了,票数应该是等于0的,而且应该是递减(排除退票和改签等情况),然而下面的程序让票数出现了负数与非递减,这是不合理的。 ```java public class ThreadSafeTest implements Runnable { //假设总共10张票 int num = 10; @Override public void run() { try { while (true) { if (num >= 0) { Thread.sleep(100); System.out.println("票数剩余" + num--); } if (num < 0) { System.out.println("对不起,票已售完!"); return; // 退出线程 } } } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { ThreadSafeTest t = new ThreadSafeTest(); // 四个线程共同访问对象t,共享一个变量 num Thread tA = new Thread(t); Thread tB = new Thread(t); Thread tC = new Thread(t); Thread tD = new Thread(t); tA.start(); tB.start(); tC.start(); tD.start(); } } ``` 某一次运行的结果如下: ```票数剩余:10 票数剩余:9 票数剩余:8 票数剩余:7 票数剩余:6 票数剩余:5 票数剩余:4 票数剩余:3 票数剩余:2 票数剩余:2 票数剩余:1 对不起,票已售完! 票数剩余:0 对不起,票已售完! 对不起,票已售完! 票数剩余:-1 对不起,票已售完! ``` 输出结果不是递减,小于零了还在运行,并且每次运行的结果都是不一样的,这是不合理的。 >[info]什么时候使用同步?如果一个变量可能被多个线程同时操作就需要同步了。同步机制也可以用**锁**来描述。