java 多线程基础知识2---同步机制

1.线程安全类

    当一个类是无状态的类时,这个类就是线程安全的,因为该类没有共享的可变状态。
    当一个类是有一个共享的可变状态时,可以使用Atomic包中的类来保证线程安全。
    当一个类有多个共享的可变状态时,那么为了保证线程安全,必须采用一定的同步机制来确保
对可变状态访问的原子性和可见性。

2.同步机制

    2.1.synchronized代码块和synchronized方法
       如果将synchronized修饰方法,那么这个方法就具有同步机制。例如:
       public synchronized static void xxxMethod(){}
      
       如果在方法内部,synchronized可以形成同步代码块,例如:
       synchronized(this){
           // do something
       }
     
      synchronized 方法一般情况下会影响并发性能,所以在使用synchronized时,尽量将synchronized的范围缩小,
同时避免synchronized块中包含 不必要的非同步代码,或者计算耗时长,或者I/O操作耗时长的代码。总之一句话:
尽量缩小synchronized的代码范围,减少synchronized块的执行时间,提高并发性


    2.2 volatile变量
       当把变量声明为volatile类型后,在编译器和运行时都会注意到这个变量是共享的,因此就不会将该变量上的操作与其他内存操作一起重排序。
       不要过度依赖volatile,仅当volatile变量能简化代码实现,以及对同步策略的验证时,才应该使用它。
       volatile通常用作某个操作完成,中断,或者状态的标识。
       当且仅当满足一下所有条件时,才能使用volatile:
      1.对变量的写入操作不依赖当前变量值,或者你能确保只有单个线程更新变量的值。
      2.该变量不会与其他变量一起纳入到不变性条件中。
      3.在访问变量时不需要加锁。 
     
总结:synchronized 不仅实现了操作的原子性,而且实现了内存可见性。而volatile只是实现了内存可见性。
       

你可能感兴趣的:(多线程)