同步静态方法与同步非静态方法

可参考
http://blog.sina.com.cn/s/blog_870def820102vshl.html

同步方法:
1):同步静态方法:某个类Object中的某个静态方法staticMethod加上同步锁之后,当某个线程Thread调用staticMethod时该线程会获取Object类的锁(当前Object的锁没被其它线程获取时,若当前Object锁被其它锁获取则会进行等待。),此时其他任何线程在Thread释放锁前都无法调用Object类中任何的同步静态方法。
2):同步非静态方法:某个类Object中的某个非静态方法Method加上同步锁之后,当某个线程Thread调用Method时会获取所对应的Object对象的锁,此时其他线程在Thread释放锁前都无法调用改对象中的任何同步非静态方法(所有非静态同步方法都共用其所属的对象的锁)
3):两者区别:
前提:Object 中包含静态同步方法staticMethod01,staticMethod02 , 非静态同步方法Method01 , Method02,线程Thread1 和 Thread2:
Object obj1 = new Object();
Object obj2 = new Object();
**a.当Thread1调用obj1.Method01()时,若Thread2想调用obj1.Method01()或者obj1.Method01()都需要先等待obj1.Method01()执行完释放锁才能进行调用。
b.当Thread1调用obj1.Method01()时,Thread2可以不用等待Thread01释放锁即可调用obj2.Method01()或者 obj2.Method02();**
因为非静态同步方法的锁是相对于对象而言。
c.当Thread1 调用obj1.staticMethod01()时,Thread2不管是调用obj1.staticMe01()还是obj2.staticMethod01()都需要等待Thread1释放锁后才能进行调用。
因为静态同步方法的锁是相对于类而言

public class Count {
    public static int count = 0;
    //同步的静态方法
    public synchronized static void addCountS() {
        count++;
    }
    //同步的非静态方法
    public synchronized void addCount() {
        count++;
    }

    @Override
    public String toString() {
        return "Count =" + count;
    }

}
public class Test {
    public static void main(String[] args) {

        for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    Count count = new Count();
                    //同步静态方法时,结果总是1000
                    // Count.addCountS();
                    //而同步非静态方法时,结果却不一定,这是因为这里同步的是非静态方法,持有锁的是调用该方法的对象,而这个run方法每次会new一个count实例,所以每次是不同的锁。
                    count.addCount();

                    System.out.println(count);

                }

            }).start();

        }

    }
}

你可能感兴趣的:(java高级)