Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程如何能够访问应该是块的同步块?_Java_Multithreading_Thread Safety_Synchronized - Fatal编程技术网

Java 线程如何能够访问应该是块的同步块?

Java 线程如何能够访问应该是块的同步块?,java,multithreading,thread-safety,synchronized,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.curren

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

您的
已同步
在实例方法上。只有在同一实例上调用该方法时,它才会被同步。你没有那样做。您正在对3个不同的实例调用
run()
方法。

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


到目前为止,我还不是专家,但您使用的是3个不同的对象(都是用new创建的)-这可能就是原因。我认为您是对的:)您必须锁定相同的资源,不同资源上的方法不同。@KshitijJain
count
必须是
volatile
static
并且在方法运行之外声明。它不必是
static
字段。它只需要是一个共享的参考。
private static final Lock LOCK = new ReentrantLock();

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

        // Your code

    } finally {
        LOCK.unlock();
    }