Java实现线程安全的几种方式:常量/数据私有/互斥同步/非阻塞同步
1.常量:
数据声明成常量,使数据无法被修改,则一定线程安全。
- final声明的基本数据类型
- String
- 枚举类型
2.数据私有
将数据变成线程私有的数据
- 栈(局部变量):多个线程访问同一个方法的局部变量时,不会出现线程安全问题,因为局部变量存储在虚拟机栈中,属于线程私有的。
- Thread Local:线程本地存储机制
3.互斥同步
java提供锁机制控制多线程对共享资源的访问,只允许获取锁的线程执行。
- synchronized:JVM实现
- ReentrantLock:JDK实现
线程的阻塞和唤醒消耗性能,影响程序的性能。适合修改多的场景。
4.非阻塞同步
先进行操作,如果没有其它线程争用共享数据,那操作就成功
- CAS机制:乐观锁
- 版本号
- 原子类AtomicInteger:CAS机制
适合查询多修改少的场景。