Java 线程同步 - Thread.sleep() 方法未按预期工作

标签 java multithreading synchronization sync

我听说,sleep() 会锁定当前的同步方法/ block 但是在这里,当我在线程 1 上调用 sleep() 时,线程 2 能够访问同一个 block 吗?谁能解释一下?

主程序.java

public class Main {     
    public static void main(String args[])
    {
        Thread1 t1 = new Thread1();
        Thread2 t2 = new Thread2();
        System.out.println("going to start t1");
        t1.start();
        System.out.println("going to start t2");
        t2.start();

    }

}

============================================= ======================

线程1.java

public class Thread1 extends Thread{

    public void run() { 
        Syncc s1 = new Syncc();
        s1.me("T1:");
    }   

}

============================================= ======================

线程2.java

public class Thread2 extends Thread{

    public void run() { 
        Syncc s2 = new Syncc();
        s2.me("T2:");
    }   
}

============================================= ======================

同步.java

public class Syncc{

    public void me(String s){
        synchronized(this){
        for(int i=0; i<=5; i++)
        {
            System.out.println(s+" "+" "+i);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {              
                e.printStackTrace();
            }
        }
    }
}
}

==========================================

输出:

going to start t1
going to start t2
T2:  0
T1:  0
T2:  1
T1:  1
T1:  2
T2:  2
T1:  3
T2:  3
T1:  4
T2:  4
T2:  5
T1:  5

但是根据 sleep() 方法,它不应该解锁当前同步块(synchronized block),对吧?如果是这样,输出应该是..

要开始 t1 将开始 t2

T1:  0
T1:  1
T1:  2
T1:  3
T1:  4
T1:  5
T2:  0
T2:  1
T2:  2
T2:  3
T2:  4
T2:  5

我的意思是在线程 1 执行后只有线程 2 应该启动,对吗? 有什么问题吗?

最佳答案

这是因为您有两个不同的 Syncc 实例在这里发挥作用。每个线程都有自己的 Syncc 副本。

尝试对单个实例执行相同的操作。您也可以在静态上下文上同步并尝试。

要模拟,请修改 Thread1Thread2 以接受 Syncc 的实例。

public class Thread1 extends Thread {
    private Syncc syncc;

    public Thread1(Syncc syncc) {
        this.syncc = syncc;
    }

    public void run() { 
        this.syncc.me("T1:");
    }   
}

然后您可以这样启动它们:

public static void main(String args[]) {
    Syncc syncc = new Syncc();

    Thread1 t1 = new Thread1(syncc);
    Thread2 t2 = new Thread2(syncc);

    System.out.println("going to start t1");
    t1.start();
    System.out.println("going to start t2");
    t2.start();
}

关于Java 线程同步 - Thread.sleep() 方法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10946565/

相关文章:

java - ConcurrentLinkedQueue代码解释

Java并发和循环任务执行

multithreading - 多线程haskell的优雅退出

MySQL 错误 1442 使用 2 个触发器更新 2 个不同数据库上的 2 个表的字段

java - 在 Android 中使用 SQLite 数据库插入数据时出错

java xmlencoder 格式不正确

java - 私有(private)锁对象和内在锁

multithreading - 对 MPI_Barrier 的调用是否会影响 MPI 进程中的每个线程?

Java透明面板和面板上的自定义效果

java - 无法在 android Studio 中解析符号 'R'