new*_*ser 3 java multithreading synchronized
我很难理解同步如何在同一个对象的两个不同方法上工作.我有一个类,有两个声明为synchronized的实例方法.三个线程访问此对象的两个同步方法,但结果是意外的.线程可以互换地访问这两种方法.它们不等待释放整个对象的锁定.这是样本:
public class ThreadSafeCounterSameMonitor2 {
private int value;
public synchronized int getValue() {
return this.value;
}
public synchronized void setValue(int value) {
this.value = value;
}
public static void main(String[] args) {
ThreadSafeCounterSameMonitor2 nts = new ThreadSafeCounterSameMonitor2();
Thread th1 = new Thread(new Runnable() {
public void run() {
nts.setValue(5);
System.out.println("Thread Id " + Thread.currentThread().getId() + ", expected value is 5, value=" + nts.getValue());
}
});
Thread th2 = new Thread(new Runnable() {
public void run() {
nts.setValue(10);
System.out.println("Thread Id " + Thread.currentThread().getId() + ", expected value is 10, value="
+ nts.getValue());
}
});
Thread th3 = new Thread(new Runnable() {
public void run() {
nts.setValue(15);
System.out.println("Thread Id " + Thread.currentThread().getId() + ", expected value is 15, value="
+ nts.getValue());
}
});
th1.start();
th2.start();
th3.start();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的结果令人惊讶:
Thread Id 13, expected value is 15, value=15.
Thread Id 12, expected value is 10, value=15.
Thread Id 11, expected value is 5, value=15.
Run Code Online (Sandbox Code Playgroud)
所以,我期待10,它得到15.在我期待5,它仍然得到15.
我的理解是,当一个线程访问时,监视器中的所有同步方法都将被锁定.但他们不是.在一个线程的同一个run()方法中,我设置了一个值,然后检索它,它给了我另一个值,从另一个线程改变.
我经常阅读类似"同步方法获取对此引用的隐式锁定"之类的内容,但这显然不正确,即使对于同一监视器中的所有方法同步方法也是如此.或者我在代码中做了什么坏事?
我的问题是,我怎样才能真正锁定整个对象的同步方法?你知道一个解释这个概念的教程吗?
这里没有不可预测的结果.并且同步工作正常.问题是你打电话给方法setValue()然后一段时间后你打电话getValue().在您的示例中,线程以这样的方式覆盖,即在其他线程调用之后setValue()但在其中任何一个调用之前设置值15 getValue().
您可以添加第三个线程Thread.sleep(1000)的run()方法,并查看结果可能会更改.
同步方法获取对象的显式锁定,但仅限于该方法的持续时间.方法完成后,将返回锁定,其他线程可以自由获取.
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |