java - 线程如何能够访问应该是 block 的同步块(synchronized block)?

标签 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”就可以成功访问相同的方法并继续执行。

有人能解释一下这里发生了什么吗?根据 sleep 的概念,“线程1”进入休眠后应暂停执行。

最佳答案

您的synchronized位于实例方法上。仅当您在同一实例上调用该方法时,它才会同步。你没有这样做。您正在 3 个不同的实例上调用 run() 方法。

关于java - 线程如何能够访问应该是 block 的同步块(synchronized block)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19030972/

相关文章:

ruby-on-rails - Rack 中间件和线程安全

c# - 我可以指望 ASMX Web 服务应用程序中的线程关联吗?

java - 终结者守护者

java - Android/Java 中的 Apidaze REST API HTTP POST 调用

java - redis.clients.jedis.exceptions.JedisException : Could not return the resource to the pool

objective-c - 为什么我对 NSLock 的使用不起作用?

java - Java中RandomAccessFile的并发

java - 使用java将音频文件与文本匹配

multithreading - Delphi指针内存和释放

c - 运行时加载的共享库中的 Libcurl 和 curl_global_init