同步方法和同步代码快

来源:互联网 发布:js计算价格的误差 编辑:程序博客网 时间:2024/05/16 19:55

今天遇到一题关于同步方法和同步代码快的问题,之前没看到过所以查了一下资料,总结了一下在这里记录一下吧,以便自己日后学习

原问题是:同步方法和同步代码块的区别。

同步方法
public synchronized void method1(){}同步代码块,其中lockObject可以为任何不为null值的对象public void method2(){ synchronized  (lockObject){}}
java中每个对象都有同步锁,同步方法是指进入该方法时需要获取this对象的同步锁,而同步代码块则是可以指定需要获取哪个对象的同步锁

做了一个简单测试

public class SynObj {    public synchronized void methodA() {        System.out.println("methodA");        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public  void methodB() {        synchronized(this) {            System.out.println("methodB");        }    }    public void methodC() {        String str = "test";        synchronized (str) {            System.out.println("methodC");        }    }}

public class TestSyn {public static void main(String[] args) {        final SynObj obj = new SynObj();        Thread t1 = new Thread(new Runnable() {            @Override            public void run() {                obj.methodA();            }        });        t1.start();        Thread t2 = new Thread(new Runnable() {            @Override            public void run() {                obj.methodB();            }        });        t2.start();        Thread t3 = new Thread(new Runnable() {            @Override            public void run() {                obj.methodC();            }        });        t3.start();    }}
输出结果:

methodA.....methodC.....//methodB会5s才会打印出来methodB.....


问题答案:当一个线程进入同步方法时表示当前对象this被加锁,而同步代码块可以指定任何对象的同步锁


参考:http://m.blog.csdn.net/article/details?id=52266950



0 0
原创粉丝点击