Java 线程中的同步语句

问题描述 投票:0回答:1

我正在阅读官方教程上的主题,我正在尝试了解内在外观。

我现在了解了同步方法同步语句同步静态方法之间的不同基础。

在那篇文章的同步语句部分,给出了一个例子,他们说

在这个例子中,addName方法需要同步lastName和nameCount的变化,但也需要避免同步调用其他对象的方法。 (从同步代码调用其他对象的方法可能会产生活性部分中描述的问题。)如果没有同步语句,则必须有一个单独的、非同步的方法,其唯一目的是调用 nameList.add。

我真的不明白他们在说什么。请用一个简单的例子向我解释一下。

然后,他们说:

同步语句对于通过细粒度同步提高并发性也很有用。例如,假设类 MsLunch 有两个实例字段 c1 和 c2,它们从不一起使用。这些字段的所有更新都必须同步,但没有理由阻止 c1 的更新与 c2 的更新交错 — 这样做会通过创建不必要的阻塞来减少并发性。我们不使用同步方法或以其他方式使用与此相关的锁,而是创建两个对象来提供锁。

带有示例代码

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
    }
}

我该如何理解呢?我认为,它只是提到创建了两个对象来管理各自的变量 c1、c2,还有其他什么吗?

java java-threads
1个回答
0
投票

想象一下

MsLunch
是这样实现的:

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;

    public synchronized void inc1() {
            c1++;
    }

    public synchronized void inc2() {
            c2++;
    }
}

这仍然是完全线程安全的,但是因为两个同步部分都锁定在

MsLunch
实例中,调用
inc1
的线程将被调用
inc2
的线程阻塞。这对于保护线程安全来说是不必要的。

© www.soinside.com 2019 - 2024. All rights reserved.