0

我已经编写了下面的 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”进入睡眠后,执行应该暂停。

4

2 回答 2

3

synchronized在一个实例方法上。只有synchronized当您在同一个实例上调用该方法时才会如此。你没有那样做。您run()在 3 个不同的实例上调用该方法。

于 2013-09-26T14:31:01.613 回答
-1

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

private static final Lock LOCK = new ReentrantLock();

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

        // Your code

    } finally {
        LOCK.unlock();
    }
于 2013-09-26T14:36:44.917 回答