如何实现线程安全?
文章目录 避免共享 不可变 可重入代码 线程封闭 必须共享 互斥同步 非阻塞同步 什么是线程安全?下面是我摘自java并发编程书里给的解释: 当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。 这个解释听的是不是云里雾里?我们说的通俗一点: 线程安全就是多线程并发访问的时候,线程之间所共享的资源不会被污染或被破坏。 我们知道线程共享的内存区域主要就是java堆,而java堆主要存的就是对象和数组,所有的全局变量都存储在堆中。也就是说我们想保证线程安全,就需要保证全局变量和堆内的对象不会受其他线程影响。 由此,我们可以从数据共享和不共享两个方面来讨论实现线程安全的方式。 避免共享 通过避免共享,让所有资源都编程线程私有,达到线程安全。主要实现方法有三种: 不可变 可重入代码 线程封闭 不可变 使用final类型 通过使用final类型修饰,发布不可变对象。 String属于不可变对象,可直接使用。 使用volatile类型 通过使用Volatile类型修饰,发布不可变对象。 volatile类型修饰的变量只适用于读多写少的情况,只能确保其可见性。如果要保证线程安全,则需要保证只有单个线程去修改。 可重入代码 若一个程序或子程序可以安全的被并行执行,则称其为可重入(reentrant),即允许多个进程同时访问。 可重入代码