【问题标题】:How to check whether sleep() method in Java holds lock or not?如何检查 Java 中的 sleep() 方法是否持有锁?
【发布时间】:2020-09-11 16:02:07
【问题描述】:
class MyThread extends Thread{
   public void run(){
       print();
   }
   synchronized public void print() {
       // for(int i = 0; i< )
       System.out.println("Thread : " + Thread.currentThread().getName());
       try{
           Thread.sleep(5000);}
           catch(InterruptedException e ){
               
           }
   }
}



public class MyClass {
   public static void main(String args[]) throws InterruptedException {
     
     MyThread t1 = new MyThread();
     MyThread t2 = new MyThread();
     t1.setName("A");
     t2.setName("B");
     t1.start();
     t2.start();
     t1.join();
     t2.join();
     
     System.out.println("EOM");
     
   }
}

程序的输出 -

ThreadA
ThreadB

立即打印两行 5 秒后

EOM

根据我的理解,其中一个线程应该进入 print() 并获取锁,并且仅在 5 秒后释放它,但这里两个线程都立即执行,然后在 5 秒后打印“EOM”。

【问题讨论】:

  • 如果你想要锁类,你应该在静态方法上使用同步。

标签: java multithreading locking


【解决方案1】:

synchronized在实例方法中,每个实例互不干扰。

如果方法是static,那么它将在实例之间共享。

【讨论】:

    【解决方案2】:

    你写道:

    synchronized public void print() {
        ...
    }
    

    这只是一种写法:

    public void print() {
        synchronized(this) {
            ...
        }
    }
    

    您的两个线程中的每一个都在您的MyClass 类的不同实例上运行,因此,您的两个线程中的每一个都在一个不同的对象(不同的this 引用)上进行同步。

    当您使用synchronized(o) 块时,这只会阻止两个不同的线程同时在同一个对象 o 上同步。

    【讨论】:

    • 我有点困惑。我们如何创建两个在同一个对象上工作的线程?我的意思是,当我们创建线程实例时,我们正在创建两个对象,对吧?你能用两个线程作用于同一个对象的例子来解释一下吗?
    • @AbhishekChaudhary,这是一个单独的问题。幸运的是,它已经得到了回答:(参见stackoverflow.com/q/877096/801894。)让两个或多个线程“处理”同一个对象几乎是任何多线程程序的基本特征。使用共享对象是线程相互通信的方式。
    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 2012-06-01
    • 2012-07-03
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多