解决(保证)线程安全问题的三种方法

线程同步

当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题。
要解决上述多线程并发访问一一个资源的安全性问题:也就是解决重复票与不存在票问题, Java中提供了同步机制
(synchronized)来解决。
根据案例简述:
窗口1线程进入操作的时候,窗口2和窗口3线程只能在外等着,窗口1操作结束,窗口1和窗口2和窗口3才有机会进入代码
去执行。也就是说在某个线程修改共享资源的时候,其他线程不能修改该资源,等待修改完毕同步之后,才能去抢夺CPU
资源,完成对应的操作,保证了数据的同步性,解决了线程不安全的现象。
为了保证每个线程都能正常执行原子操作Java引入了线程同步机制。
那么怎么去使用呢?有三种方式完成同步操作:
1.同步代码块。
2.同步方法。
3.锁机制。
卖票案例出现了线程安全问题
卖出了不存在的票和重复的票

 

解决线程安全问题的一种方案:使用同步代码块


格式:
synchronized(锁对象){_
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
注意:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
把同步代码块锁住,只让- -个线程在同步代码块中执行

线程同步技术原理

解决线程安全问题:同步方法

同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外
等着。
格式:
public synchronized void method(){}
可能会产生线程安全问题的代码
同步锁是谁?
对于非static方法,同步锁就是this。
对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。

静态的同步方法
锁对象是谁?
不能是this
this是创建对象之后产生的,静态方法优先于对象
静态方法的锁对象是本类的class属性-->closs文件对象(反射)

解决线程安全同步第三种方式:Lock锁

java.util. concurrent. locks. Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,
同步代码块/同步方法具有的功能L .ock都有,除此之外更强大,更体现面向对象。
Lock锁也称同步锁,加锁与释放锁方法化了, 如下:
●public void lock() :加同步锁。
●public void unlock() :释放同步锁。

猜你喜欢

转载自blog.csdn.net/weixin_51980491/article/details/113030502