多线程——引入同步代码块解决窗口卖票产生负票的问题

继续讨论多窗口卖票问题中的线程安全问题: 
方式二: 
java

1、问题: 出现了线程安全问题 ?安全

2、问题的缘由: 
当多条语句在操做同一个线程共享数据时,一个线程对多条语句只执行了一部分,尚未执行完,另外一个线程参与进来执行。致使共享数据的错误。多线程

3、出现线程安全问题的根本缘由: 
一、存在两个或者两个以上的线程对象,并且线程之间共享着一个资源。 
二、有多个语句操做了共享资源。线程

4、解决办法: 
一、对多条操做共享数据的语句,只能让一个线程都执行完。在执行过程当中,其余线程不能够参与执行。 
二、线程安全问题的解决方案:sun提供了线程同步机制让咱们解决这类问题的。code

5、java线程同步机制的方式: 
一、同步代码块: 
1)同步代码块的格式:对象

synchronized(锁对象){
    须要被同步的代码...
}
  • 1
  • 2
  • 3


对象如同锁。持有锁的线程能够在同步中执行。 
没有持有锁的线程即便获取cpu的执行权,也进不去,由于没有获取锁。资源

2)同步代码块要注意事项: 
a)任意的一个对象均可以作为锁对象。 
b)在同步代码块中调用了sleep方法并不释放锁对象的。 
c)只有真正存在线程安全问题的时候才使用同步代码块,不然会下降效率的。 
d)多线程操做的锁对象必须是惟一共享的,不然无效。 
同步

6、同步的前提: 
一、必需要有两个或者两个以上的线程。 
二、必须是多个线程使用同一个锁。效率

必须保证同步中只能有一个线程在运行。方法

7、同步代码块的利弊:  好处:解决了多线程的安全问题。  弊端:多个线程须要判断锁,较为消耗资源。

相关文章
相关标签/搜索