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

来源:互联网 发布:中国美国商会 知乎 编辑:程序博客网 时间:2024/05/21 09:59

可参考
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();        }    }}
0 0
原创粉丝点击