我听说,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
副本。
尝试对单个实例执行相同的操作。您也可以在静态上下文上同步并尝试。
要模拟,请修改 Thread1
和 Thread2
以接受 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/