【发布时间】:2018-07-29 16:46:21
【问题描述】:
这似乎是一个非常幼稚的问题,但我在任何地方都找不到任何具体的答案。我什至实际尝试过,但由于我们无法预测 Java 中线程资源分配的行为,因此很难确定。 我只想知道我是否可以从该类的同一实例的两个不同线程同时访问该类的同步方法和非同步方法?
【问题讨论】:
标签: java multithreading synchronization java-threads
这似乎是一个非常幼稚的问题,但我在任何地方都找不到任何具体的答案。我什至实际尝试过,但由于我们无法预测 Java 中线程资源分配的行为,因此很难确定。 我只想知道我是否可以从该类的同一实例的两个不同线程同时访问该类的同步方法和非同步方法?
【问题讨论】:
标签: java multithreading synchronization java-threads
没有发现任何问题。试试这个:
public class Main {
public static final SyncNotsynced sn = new SyncNotsynced();
public static void main(String[] args){
Thread t1 = new Thread(sn::synced);
Thread t2 = new Thread(sn::notsynced);
t1.start();
t2.start();
}
public static class SyncNotsynced {
public synchronized void synced(){
System.out.println(Thread.currentThread().getName() + " enter synced");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName() + " exit synced");
}
public void notsynced(){
System.out.println(Thread.currentThread().getName() + " enter notsynced");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName() + " exit notsynced");
}
}
}
或查看live example :)。如您所见,Thread 1 和 Thread 2 的输入都是在退出之前发生的:
Thread-0 enter synced
Thread-1 enter notsynced
Thread-0 exit synced
Thread-1 exit notsynced
对于正式的解释,你可以阅读JLS 17,但简而言之,只有一个线程可以进入同一个对象监视器上的同步块。
顺便说一句,我使用了Thread.sleep because(强调我的):
Thread.sleep 导致当前正在执行的线程休眠 (暂时停止执行)在指定的期限内,受制于 系统计时器和调度程序的精度和准确性。 话题 不会失去对任何监视器的所有权,并恢复执行 将取决于调度和处理器的可用性 执行线程。
【讨论】: