我编写了以下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”进入睡眠状态后执行应该保持不变。
答案 0 :(得分:3)
您的synchronized
是实例方法。如果您在同一个实例上调用该方法,它将只是synchronized
。你不是那样做的。您在3个不同的实例上调用run()
方法。
答案 1 :(得分:-1)
如果要对所有线程进行同步,则需要使用一些静态字段。 它可以是监视器(与同步一起使用的简单对象)或锁定
private static final Lock LOCK = new ReentrantLock();
@Override
public void run() {
try {
LOCK.lock();
// Your code
} finally {
LOCK.unlock();
}