方法锁和静态方法锁的区别

来源:互联网 发布:淘宝为什么分数低 编辑:程序博客网 时间:2024/05/18 01:13
静态方法需要对Class对象加锁。
非静态方法,需要对本对象(this)加锁。
非静态方法举例,例如,下面的两个例子的效果是完全一样的。
    public synchronized int getX() {
        return x++;
    }
    public int getX() {
        synchronized (this) {
            return x;
        }
    }
 
静态方法举例,例如,下面的两个例子的效果是完全一样的。
public static synchronized int setName(String name){
      Xxx.name = name;
}
public static int setName(String name){
      synchronized(Xxx.class){
            Xxx.name = name;
      }
}
一定要注意哪个对象正被用于锁定:
1、调用同一个对象中非静态同步方法的线程是互斥的。如果是不同对象,则每个线程有自己的对象的锁,线程间彼此互不干预。
 
2、调用同一个类中的静态同步方法的线程将是互斥的,它们都是锁定在相同的Class对象上。
 
3、静态同步方法和非静态同步方法将永远不是互斥的,因为静态方法锁定在Class对象上,非静态方法锁定在该类的对象上。
 
4、对于同步代码块,要看清楚什么对象已经用于锁定(synchronized后面括号的内容)。在同一个对象上进行同步的线程将是互斥的,在不同对象上锁定的线程将永远不会互斥。

具体可查看:http://lavasoft.blog.51cto.com/62575/99155/
0 0
原创粉丝点击