如何保证线程安全
1.无状态
没有公共资源,线程一定安全
2.不可变
公共资源不可变,线程一定安全

3.无修改权限
不提供修改入口,属性私有

4.synchronized同步机制
同步方法和同步代码块,优先使用同步代码块,因为粒度小
5.Lock接口实现类ReentrantLock
显示锁ReentrantLock包含了公平锁、非公平锁、可重入锁、读写锁,使用时要在finally里手动释放
6.分布式锁
对于synchronized和lock对于单个节点可以保证线程安全,但是不同节点的分布式环境无法保证,这时可以使用分布式锁
比如:数据库分布式锁、zookeeper分布式锁、redis分布式锁

7.volatile
如果只要求多个线程之间的可见性,比如只是控制某个功能的开关,那么使用volatile就可以
public class VolatileTest { volatile boolean flag = true; public void updateFlag() { this.flag = false; System.out.println("修改flag值为:" + this.flag); } public static void main(String[] args) { VolatileTest test = new VolatileTest(); new Thread(() -> { while (test.flag) { } System.out.println(Thread.currentThread().getName() + "结束"); }, "Thread1").start(); new Thread(() -> { try { Thread.sleep(2000); test.updateFlag(); } catch (InterruptedException e) { } }, "Thread2").start(); } }
8.ThreadLocal
9.线程安全集合
CopyOnWriteArrayList、ConCurrentHashMap、CopyOnWriteArraySet、ArrayBlockingQueue等等
10.CAS机制JDK
11.做数据隔离
比如对于同一用户处理使用单个线程,不存在多个线程对同一用户进行处理
作者:blanset
出处:https://www.cnblogs.com/blanset/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号