要实现线程安全一般至少需要两个特性:原子性和可见性。
实现方式:
1)使用synchronize
:它本具有原子性和可见性的,所以如果使用了synchronize修饰的操作,那么就自带了可见性,synchronized
使用悲观锁来实现线程安全;
2)使用原子类代替基本数据类型,原子类是使用乐观锁来实现线程安全,多线程环境下执行a++,可以使用AtomicInteger
类incrementAndGet()
方法实现,同样是使用了volatile来保证可见性;使用Unsafe
调用native本地方法CAS
,CAS采用总线加锁或缓存加锁方式来保证原子性;
在线视频教程推荐:java教程
3 ) 使用volatile
关键字,volatile不一定就有原子性,比如用volatile修饰的变量进行++或者--操作(num++),我们需要让volatile修饰的变量需要具有原子性,那么我们一般可以设置在boolean
类型变量上,如下:
volatile boolean tag = true; 线程1 while(tag){}; 线程2 while(tag){};
如果有变量自增或者自减,我们可以使用原子类(AtomicInteger
)。
4)使用ThreadLocal
对各个线程进行隔离;
5)我们还可以用其他的锁,比如重入锁(ReentrantLock
) 保证线程安全;
6)我们还可以用 临界区、互斥量、信号量 保证线程安全。
本篇文章由java入门学习栏目为大家推荐,欢迎大家来共同学习交流。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。