线程如何能够访问应该被阻塞的同步块?

时间:2013-09-26 14:26:33

标签: java multithreading thread-safety synchronized

我编写了以下Java程序。这个程序正在创建三个线程并启动它们:

public class MyThread implements Runnable {

    @Override
    public synchronized void run() {

        int count = 0;
        while (true) {                

                System.out.println("" + Thread.currentThread().getName());

                if (count == 20 && Thread.currentThread().getName().equals("Thread-1")) {
                    try {                        
                        Thread.currentThread().sleep(100000000);                        
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                count++;
            }//while ennds here
    }//run ends here
}//class ends here


public class TestThread {

    public static void main(String[] args){

        Thread t1 = new Thread(new MyThread());
        t1.setName("Thread 1");
        Thread t2 = new Thread(new MyThread());
        t1.setName("Thread 2");
        Thread t3 = new Thread(new MyThread());
        t1.setName("Thread 3");        

        t1.start();
        t2.start();
        t3.start();
    }

}

第二个线程在一段时间后继续睡眠。

当run方法同步时,它应该一次只能被一个线程访问。

Sleep方法永远不会释放对象的锁定。但是,一旦“线程1”进入休眠状态,之后“线程2”和“线程3”成功地能够访问相同的方法并继续执行。

有人能解释一下这里发生了什么吗?根据睡眠的概念,“线程1”进入睡眠状态后执行应该保持不变。

2 个答案:

答案 0 :(得分:3)

您的synchronized是实例方法。如果您在同一个实例上调用该方法,它将只是synchronized。你不是那样做的。您在3个不同的实例上调用run()方法。

答案 1 :(得分:-1)

如果要对所有线程进行同步,则需要使用一些静态字段。 它可以是监视器(与同步一起使用的简单对象)或锁定

private static final Lock LOCK = new ReentrantLock();

@Override
public void run() {
    try {
        LOCK.lock();

        // Your code

    } finally {
        LOCK.unlock();
    }