放在循环外面和在循环里面的区别"/>
synchronized放在循环外面和在循环里面的区别
放在while外面就是进循环之前判断一次synchronized(){},能进去的话就进去执行while循环。而进while循环之后就不再判断synchronized(){}了。
放在while里面就是每次执行while循环的时候执行到synchronized(){}语句都要进行判断synchronized()
举个例子说下
(1)写在while外面的时候:比如你截图的这个代码功能应该是模拟售票的吧。比如有三个线程t1,t2,t3模拟1、2、3号窗口售票。如果你写在while外面的话,比如t2一旦拿到cpu执行权,并且判断synchronized(){}通过的话,就一直是t2窗口在卖票了,因为这时候t1和t3判断synchronized(){}是锁的都进不来,t2就一直在while循环,直到t2while循环完毕出来的时候,t1或者t3才能进去,这时候票已经卖完了。
说简单点就是,t1,t2,t3任意一个线程先拿到执行权的话就会一直是它在循环了。因为没有能停下来的语句,别的线程也执行不了,因为synchronized(){}是锁的。只有该线程循环完出来的时候,synchronized(){}才是打开的。这时候就不能满足t1,t2,t3随机进入while循环
(2)如果写在while里面就不同了,这三个线程不论是谁得到cpu执行权都会先进入while循环,然后判断synchronized(){}是否是锁的,如果不是就可以卖出一张票,如果是就等待别的线程先执行完。
(3)简单拿模拟窗口卖票来说,我们看到的执行效果的区别就是:
A:锁在while外面的时候,运行程序,不管有多少个窗口也总是一个窗口在卖票,从头卖到尾绝对永远都是先进入循环的那个线程会把所有票卖完
B:锁在while循环里面的时候,会是随机的一个窗口在卖,如果是三个线程的话,就应该是三个窗口都有在卖。
更多推荐
synchronized放在循环外面和在循环里面的区别
发布评论