JAVA多线程_线程安全问题

Posted javasds

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)

 

 

以上是关于JAVA多线程_线程安全问题的主要内容,如果未能解决你的问题,请参考以下文章

温故Java基础多线程编程—线程安全

Java_多线程实现同步

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_3_线程安全问题产生的原理

Java_14:多线程高阶

Java_多线程通讯

多线程--线程安全