在同步代码块中使用字符串作为同步监视器,在代码块中修改字符串变量,为什么不是同步?
- 我在同步代码块中修改了作为同步监视器的字符串lock的值,希望得出的结果是异步的(就是多个线程能够同时进入synchronized代码块中),但结果却是同步的.我认为其他线程进入的时候会检测该常量是否被锁,由于我已经在刚才运行的线程中更改了常量的值后,其他线程再进入的时候发现修改后的常量没有被锁,应该会进入,但却发生了同步.求大神解答!!
package duixiangsuo;
public class ChangeLock {
private String lock = "lock";
private void method() {
synchronized (lock) {
try {
System.out.println("当前线程" + Thread.currentThread().getName() + "开始");
lock = "123";
Thread.sleep(2000);
System.out.println("当前线程:" + Thread.currentThread().getName() + "结束");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
final ChangeLock str = new ChangeLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
str.method();
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
str.method();
}
}, "t2");
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
str.method();
}
}, "t3");
t3.start();
t1.start();
//Thread.sleep(5000);
t2.start();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
synchronized
的是对象(即"lock"
),而不是对象的引用。当你同时启动3个线程时,可能都
synchronized
到了"lock"
。要想得到你的预期(即synchronized
到不同的对象),可做两点改动:String lock
前加上volatile
关键字,保证引用的改变对其他线程是可见的;synchronized (lock)
前随机等待若干毫秒,让各线程不同时跑到synchronized
,比如这样: