【发布时间】:2017-07-07 06:21:49
【问题描述】:
我在一个类中有多个方法,并且大多数方法都有关键部分(共享数据)。所以我将这些方法设为同步。假设线程 t1 正在运行同步块之一。同时线程 t2 可以访问其他方法的临界区吗?
class Sample{
synchronized public void method1(){
}
synchronized public void method2(){
}
synchronized public void method3(){
}
public void method4(){
}
}
【问题讨论】:
-
整个对象
-
@JavaUser 假设:所有线程都是用相同的示例对象创建的 答案:如果调用了任何同步方法(方法 1 或方法 2 或方法 3),那么所有其他同步方法将保持阻塞,直到执行完成完全的 。方法 4 永远不会得到 block ,无论情况如何。
-
相反,如果您有两个相同类型的对象
Sample s1 = new Sample(); Sample s2 = new Sample();,那么当在s1上调用同步方法时,只有s1被锁定,而不是s2。这应该是显而易见的,但有时人们会忘记这是有区别的。 -
Java 中的同步实例方法在拥有该方法的实例(对象)上同步。因此,每个实例都有其同步方法在不同的对象上同步:拥有的实例。只有一个线程可以在同步实例方法中执行。如果存在多个实例,则一次可以在每个实例的同步实例方法中执行一个线程。每个实例一个线程。见tutorials.jenkov.com/java-concurrency/…
-
如果
synchronized方法是static,那么方法所有者和该块的监视器是Class,所以整个类都被锁定了。
标签: java multithreading thread-safety synchronized