在同步代码块中使用字符串作为同步监视器,在代码块中修改字符串变量,为什么不是同步?

发布于 2022-09-06 05:41:41 字数 1436 浏览 13 评论 0

  • 我在同步代码块中修改了作为同步监视器的字符串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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

っ左 2022-09-13 05:41:41

synchronized的是对象(即"lock"),而不是对象的引用。

当你同时启动3个线程时,可能都synchronized到了"lock"。要想得到你的预期(即synchronized到不同的对象),可做两点改动:

  1. String lock前加上volatile关键字,保证引用的改变对其他线程是可见的;
  2. synchronized (lock)前随机等待若干毫秒,让各线程不同时跑到synchronized,比如这样:
    private AtomicInteger counter = new AtomicInteger(0);

    private void method() {
        Thread.sleep(counter.addAndGet(100)); // 这里还要catch一个InterruptedExxception
        synchronized (lock) {
            ...
        }
    }

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文