关闭

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

标签: 多线程
128人阅读 评论(0) 收藏 举报
分类:

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();  
        }  
    }  
}  
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3405次
    • 积分:208
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:4篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论