三、synchronized修饰static方法

  synchronized静态(static)方法的用法如下面代码示例:

public static synchronized void fun_3()
{
    ……
}

  如果方法用static修饰,synchronized的作用范围是class一级的,它对类的所有对象起作用。像第一点中的fun()方法,如果是static的,那么synchronized对p1对象和p2对象都起到同步互斥的作用。

  其实说白了,对于static的synchronize也可以理解为对象级别的(hoho!是不是有点糊涂了? ^_^),因此下面代码可以达到同样效果:

class XX
{
    public static void fun_4()
    {
    synchronized(XX.class)
    {
        ……
    }
    }
}

  请注意,XX.class也是一个对象,类型是Class,在一个ClassLoader里,它是的。因此,我在前面说,也理解它是对象级别的。

  后简单总结一下:

  (1)通常把synchronized关键字的作用范围划分为类的范围和对象的范围两种,不过偶个人理解的是,既然取得的锁都是对象(参考第三点),也可以认为synchronized关键字都作用于对象。

  (2)synchronized关键字是不能继承的,即,父类的synchronized方法在子类中不是synchronized,必须要重新的显式的声明为synchronized才行。

  (3)实现同步需要很大的系统开销,导致延迟等待,甚至可能造成死锁,所以在非多线程情况下不要使用。