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并发实战中,介绍了以下方式安全发布:

  1. 在静态初始化函数中初始化一个对象引用。
  2. 将对象的引用保存到volatile类型的域或者AtomicReferance对象中。
  3. 将对象的引用保存到某个正确构造对象的final类。
  4. 将对象的引用保存到一个由锁保护的域中。
  3、线程安全库中的容器提供的安全发布保证:

相关推荐