当多条语句(线程)在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。这样就是线程的安全问题。
解决线程安全的方式有两种:
1.synchronized同步机制
2.Lock锁
一、synchronized同步机制
1.同步代码块
同步代码块的意思就是将需要操作的共享数据的代码段用synchronized同步执行
synchronized (对象){ // 需要被同步的代码; }
2.同步方法
synchronized可以放在方法声明中,表示整个方法为同步方法。 public synchronized void show (String name){ …. }
可以将此方法放入需要多线程执行的run()方法中调用
二、Lock锁
从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。
锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。
class A{ private final ReentrantLock lock = new ReenTrantLock(); public void main(){ lock.lock(); try{ //保证线程安全的代码; }finally{ lock.unlock();//一定注意要下锁 } } }
synchronized 与 Lock 的对比
1. Lock是显式锁(手动开启和关闭锁,别忘记关闭锁),synchronized是隐式锁,出了作用域自动释放
2. Lock只有代码块锁,synchronized有代码块锁和方法锁
3. 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)
原文地址:https://www.cnblogs.com/javasds/p/12383884.html
时间: 2024-10-29 05:25:41