什么是线程安全与线程不安全

线程安全是指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性。线程不安全就是不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

本教程操作环境:windows7系统、java8版、DELL G3电脑。

什么是线程安全与线程不安全

假设A和B同时去不同ATM上取同一张卡的1000块钱,如果是线程不安全,那么A和B可以同时取到1000块钱(两人赚大发啦),而如果线程安全呢,就只有一个人能取出来1000块钱。

线程安全是指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性。

线程不安全就是不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

是什么决定的线程安全问题呢?

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

有哪些可以解决多线程并发访问资源的安全问题呢?

有三种方式:分别是 同步代码块 、同步方法和锁机制(Lock)

(1)同步代码块:

synchronized(同步锁)
{
//方法体
}

(2)同步方法:给多线程访问的成员方法加上synchronized修饰符

public synchronized  void test(){
     //方法体
}

以上两种该方法都用到了Java语言的关键字synchronized,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

(3)锁机制(Lock)

//Java提供的同步代码块的另一种机制,比synchronized关键字更强大也更加灵活。
//这种机制基于Lock接口及其实现类(例如:ReentrantLock)
//它比synchronized关键字好的地方:
//1、提供了更多的功能。tryLock()方法的实现,这个方法试图获取锁,
//如果锁已经被其他线程占用,它将返回false并继续往下执行代码。
//2、Lock接口允许分离读和写操作,允许多个线程读和只有一个写线程。
//3、具有更好的性能
 public class PrintQueue {
      private final Lock A=new ReentrantLock();
      //...
 }

以上就是什么是线程安全与线程不安全的详细内容,更多请关注易知道|edz.cc其它相关文章!

推荐阅读