Java 线程如何能够访问应该是块的同步块?
我已经编写了下面的Java程序。此程序正在创建三个线程并将它们全部启动:Java 线程如何能够访问应该是块的同步块?,java,multithreading,thread-safety,synchronized,Java,Multithreading,Thread Safety,Synchronized,我已经编写了下面的Java程序。此程序正在创建三个线程并将它们全部启动: public class MyThread implements Runnable { @Override public synchronized void run() { int count = 0; while (true) { System.out.println("" + Thread.curren
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”进入睡眠状态后,执行应该处于暂停状态。您的
已同步
在实例方法上。只有在同一实例上调用该方法时,它才会被同步。你没有那样做。您正在对3个不同的实例调用run()
方法。如果您希望对所有线程进行同步,则需要使用一些静态字段。
它可以是监视器(与同步一起使用的简单对象)或锁
到目前为止,我还不是专家,但您使用的是3个不同的对象(都是用new创建的)-这可能就是原因。我认为您是对的:)您必须锁定相同的资源,不同资源上的方法不同。@KshitijJain
count
必须是volatile
和static
并且在方法运行之外声明。它不必是static
字段。它只需要是一个共享的参考。
private static final Lock LOCK = new ReentrantLock();
@Override
public void run() {
try {
LOCK.lock();
// Your code
} finally {
LOCK.unlock();
}