【发布时间】:2016-08-09 20:59:13
【问题描述】:
场景 1.
同步方法是私有的,位于实现 Runnable 的类中
Main.java
public class Main {
Thread thread1 = new Thread(new MyRunnable);
. . .
}
MyRunnable.java
public class MyRunnable implements Runnable {
. . .
private synchronized doSomething {
}
场景 2。
同步方法是公共的和静态的,位于主类中
Main.java
public class Main {
Thread thread1 = new Thread(new MyRunnable);
public synchronized static doSomething() {
}
}
MyRunnable.java
public class MyRunnable implements Runnable {
. . .
}
问题:以上哪种情况是正确的?
我正在关注场景 2。所以我在 Main 类中有一个同步方法。这工作正常。当我将此同步方法移至 MyRunnable 类时,我没有发现任何区别。这很奇怪。我原以为它会失败。 synchronized 阻止同时访问此方法。
但是如果我实例化一个类的两个实例:
MyRunnable runnable1 = new MyRunnable();
MyRunnable runnable2 = new MyRunnable();
每个可运行文件都有自己的 synchronized ,而 synchronized 对编译器没有任何意义。我理解正确吗?
【问题讨论】:
-
我觉得你的理解是对的,是的。
synchronized应该默认为这个类的实例,用于非静态方法;如果您有两个不同的实例,它们都将能够同时输入synchronized方法,因为它们正在查看不同的东西;这些方法具有相同名称的事实是无关紧要的。顺便说一句,当你说你“期待它失败”时 - 你期待看到什么?同步是为了避免线程冲突,这种冲突很难检测到,而且通常取决于运气。 -
多个线程可能正在访问同一个实例,此时
synchronized再次变得相关。 -
synchronized正在定义 runtime 行为,由 JVM 确保,它不取决于编译器对其进行任何处理。话虽如此,synchronized对象锁定类,而不是实例。我不确定你的问题到底是什么,在这里。您预计会失败/发生什么,以及何时(正常运行时间、编译时间)? -
@Edward Peters 对于解释不明确,我深表歉意。期望它失败我的意思是
I was expecting the synchronized become regular method。这正是我的想法if you have two different instances, they will both be able to enter the synchronized method at once, because they're looking at different things但是我想先与专家确认这一点 -
是的,我想在那里写
static。
标签: java multithreading synchronized