3、Synchronized锁定的是类变量 ,即static变量(可能是属性,可能是方法)(锁定类对象)

  Java代码

  • public class Demo3 {     
  •     static Object o = new Object();     
  •     
  •     public static synchronized void m1() {     
  •         //....   
  •     }     
  •     
  •     public static void m2() {     
  •         //...   
  •         synchronized (Demo3.class) {     
  •             //.....   
  •         }     
  •         //.....   
  •     }     
  •     
  •     public static void m3() {     
  •         //..........   
  •         try {     
  •             synchronized (Class.forName("Demo3")) {     
  •               //............   
  •             }     
  •         } catch (ClassNotFoundException ex) {     
  •         }     
  •         //.............   
  •     }     
  •     
  •     public static void m4() {     
  •         //............   
  •        synchronized(o){     
  •          //........   
  •        }     
  •         //..........   
  •     }     
  • }

  以上4个方法中实现的效果都是一样的,其锁定的对象都是类Demo3,而不是类实例对象 ,即在多线程中,其共享的资源是属于类的,而不是属于类对象的。在这种情况下,如果thread1 访问了这4个方法中的任何一个,在同一时间内其它的线程都不能访问这4个方法。

  4、类的方法中访问了多线程共同的资源,且该资源是可变的,这种情况下也是需要进行同步的

  Java代码

  • public class Demo4 {     
  •     static String path = "file path";     
  •     
  •     public void readConfiFile() {     
  •         synchronized (path) {     
  •            // 读取该path指定的文件。   
  •         }     
  •     
  •     }     
  •     
  •     public void writeConfiFile() {     
  •         synchronized (path) {     
  •             //写信息到该path指定的文件。   
  •         }     
  •     }     
  • }

  这种情况下,必须锁定为 类变量,而不能进行锁定类实例对象,因为这是变象的一种类资源共享,而不是类实例对象资源共享。

  成也线程,败也线程,用好了可以提升性能,用不好则会使系统后患无穷。

  PS:进行线程同步需要很大的系统开销, 所以,在使用时,如果不是必须的,则尽量不使用同步功能。