代码之家  ›  专栏  ›  技术社区  ›  somnathchakrabarti

两个线程同时执行同步块

  •  47
  • somnathchakrabarti  · 技术社区  · 7 年前

    Thread 进入同步块,等待5秒,然后退出。我已经开始两次了 同时创建实例。

    预期其中一个线程将拥有同步对象上的锁,而另一个线程将等待。5秒后,当锁所有者退出时,等待的线程将执行。

    但是,实际上,两个线程同时执行同步块,并且同时退出。

    预期产量:

    Thread-X <timeX> received the lock.
    Thread-X <timeX+5s> exiting...
    Thread-Y <timeY> received the lock.
    Thread-Y <timeY+5s> exiting...
    

    实际输出:

    Thread-X <time> received the lock.
    Thread-Y <time> received the lock.
    Thread-X <time+5s> exiting...
    Thread-Y <time+5s> exiting...
    

    我是不是漏了什么?

    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Test2 {
    public static void main(String[] args) {
        MyRunnable m = new MyRunnable();
        Thread t = new Thread(m);
        Thread t1 = new Thread(m);
        t.start();
        t1.start();
        }
    }
    
    class MyRunnable implements Runnable {
        @Override
        public void run() {
            synchronized (this) {
                try {
                    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
                    Date date = new Date(System.currentTimeMillis());
                    System.out.println(Thread.currentThread().getName() + " " + formatter.format(date) + " received the lock.");
                    wait(5000);
                    date = new Date(System.currentTimeMillis());
                    System.out.println(Thread.currentThread().getName() + " " + formatter.format(date) + " exiting...");
                } catch(InterruptedException ie) {}
            }
        }
    }
    
    3 回复  |  直到 7 年前
        1
  •  60
  •   Sled bayer    7 年前

    答案在于 java.lang.Object.wait(long) 文件上写着:

    […]此方法使当前线程(称为T)将自身放入此对象的等待集中,然后 放弃此对象上的所有同步声明 . [...]

        2
  •  32
  •   Hulk    7 年前

    Thread.sleep(5000);
    

    JavaDocs for Thread.sleep:

    不会失去任何监视器的所有权。

        3
  •  14
  •   Oleksandr Pyrohov Andreas    7 年前

    以下引用自 Oracle Tutorials

    什么时候? wait 调用时,线程释放锁并挂起 执行。

    synchronized 被同一个物体保护的街区!打电话 等待 在您的示例中,释放锁,从而允许另一个线程获取锁。

    推荐文章