java线程安全
在java中,有一些线程安全操作的常识,在这里我进行总结一下:
1、java.util.concurrent.atomic包中包含了一些原子变量类,用于实现在数值和对象引用上的原子状态转换。通过用AtomicLong来代替long类型的计数器,能够确保所有对计数器状态的访问操作都是原子的。
@ThreadSafe public class Counting{ private final AtomicLong count = new AtomicLong(0); public long getCount(){ return count.get(); } //safe method public yourMathod(){ //do something count.incrementAndGet(); //do something } }
同时合理利用同步代码块的合理大小,需要在各种设计需求中间进行权衡,包括安全性、简单性和性能。注意这里不要和atomic进行混用,因为这样会带来操作和管理上的麻烦。
//@GuardedBy( lock )有以下几种使用形式: //1、@GuardedBy( "this" ) 受对象内部锁保护 //2、@GuardedBy( "fieldName" ) 受 与fieldName引用相关联的锁 保护。 //3、@GuardedBy( "ClassName.fieldName" ) 受 一个类的静态field的锁 保存。 //4、@GuardedBy( "methodName()" ) 锁对象是 methodName() 方法的返值,受这个锁保护。 //5、@GuardedBy( "ClassName.class" ) 受 ClassName类的直接锁对象保护。而不是这个类的某个实例的锁对象。 @GuardeBy("this") private long counts; public synchronized long getCounts(){return counts;} public void yourMethod() { synchronized(this){ ++counts; } }
2、关于可变对象的安全发布,在Java并发实战中,介绍了以下方式安全发布:
- 在静态初始化函数中初始化一个对象引用。
- 将对象的引用保存到volatile类型的域或者AtomicReferance对象中。
- 将对象的引用保存到某个正确构造对象的final类。
- 将对象的引用保存到一个由锁保护的域中。
相关推荐
Hy 2020-11-13
xrslt 2020-11-06
yutian0 2020-10-26
杨树 2020-09-21
zhuyonge 2020-08-01
zhuyonge 2020-07-26
xiaoemo0 2020-07-18
fraternityjava 2020-06-26
luohui 2020-06-26
dxyadc 2020-06-26
luohui 2020-06-21
三动 2020-06-21
fengyun 2020-06-14
fraternityjava 2020-06-14
waitui00 2020-06-14
fraternityjava 2020-06-10
shayuchaor 2020-06-07