synchronized关键字锁住的是对象还是代码块

synchronized 修饰的是对象,而不是代码块。测试代码来自于博客http://www.cnblogs.com/QQParadise/articles/5059824.html
下面两端代码都可以正常显示执行结果:

test开始..
test结束..
test开始..
test结束..
test开始..
test结束..

第一段代码锁住了Sync这个类对象(取决于static关键字),而第二段也是锁住了Sync这个类对象,取决于synchronize(clock)中的clock。而第三段代码执行结果就是错误的,因为每次都锁住了新建的对象。

class Sync {  

    public static synchronized void test() {  
        //synchronized (Sync.class) {  
            System.out.println("test开始..");  
            try {  
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("test结束..");  
        //}  
    }  
}  

class MyThread extends Thread {  

    public void run() {  
        Sync sync = new Sync();  
        sync.test();  
    }  
}  

public class Main {  

    public static void main(String[] args) {  
        for (int i = 0; i < 3; i++) {  
            Thread thread = new MyThread();  
            thread.start();  
        }  
    }  
}  
class Sync {  

    public void test() {  
        synchronized (Sync.class) {  
            System.out.println("test开始..");  
            try {  
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("test结束..");  
        }  
    }  
}  

class MyThread extends Thread {  

    public void run() {  
        Sync sync = new Sync();  
        sync.test();  
    }  
}  

public class Main {  

    public static void main(String[] args) {  
        for (int i = 0; i < 3; i++) {  
            Thread thread = new MyThread();  
            thread.start();  
        }  
    }  
}  
class Sync {  

    public synchronized  void test() {  
        //synchronized (Sync.class) {  
            System.out.println("test开始..");  
            try {  
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("test结束..");  
        //}  
    }  
}  

class MyThread extends Thread {  

    public void run() {  
        Sync sync = new Sync();  
        sync.test();  
    }  
}  

public class Main {  

    public static void main(String[] args) {  
        for (int i = 0; i < 3; i++) {  
            Thread thread = new MyThread();  
            thread.start();  
        }  
    }  
}  
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/upwind_fly/article/details/73187852
文章标签: 多线程
个人分类: java语法
上一篇linux 安装pyqt
下一篇java并发编程实战读书笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭