JAVA多线程_线程安全问题

当多条语句(线程)在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。这样就是线程的安全问题。

解决线程安全的方式有两种:

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将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)

猜你喜欢

转载自www.cnblogs.com/javasds/p/12383884.html