繁体   English   中英

有没有可行的用例,其中Java同步关键字比Atomics更好?

[英]Is there a viable use case where Java synchronized keyword is better than Atomics?

我没有太多的线程处理经验,但是我用Atomics编写了一个漂亮的非阻塞顺序Id生成器。 现在,我想知道为什么有人会使用同步,因为它要慢得多……在现代64位多核硬件上是否有原因? 其他人现在问我关于原子的问题。 我希望能够告诉他们不要使用该关键字,除非他们将其部署到古老的硬件上。

因为您不能仅使用原子来单独执行多个操作(从技术上讲您可以,因为您可以使用原子来实现“锁定”,但是我认为这很重要)。 您也不能使用原子进行阻塞等待(您可以进行繁忙的等待,但这几乎总是一个坏主意)。

这是OP的一个练习:编写一个程序,该程序使用多个线程将带有时间戳的日志消息写入同一文件,该消息必须按时间戳顺序显示在文件中。 仅使用原子来实现此目的,而无需重新发明ReentrantLock / synchronized。

现在我想知道为什么有人会使用同步,因为它要慢得多...

也许是因为速度不是一切。

实际上,如果您客观地看待在实际应用程序中使用“漂亮”生成器的整体性能优势,我怀疑您会发现它太小了而已。 对应用程序进行性能分析将告诉您。

还有一个问题是您的基准测试实际上是否有效; 也就是说,您是否正在做避免JVM预热异常,优化异常等误导性影响所需的工作。 以及您是否(实际上)衡量有争议和无争议的案例。


有没有可行的用例,其中Java同步关键字比Atomics更好?

这很容易。

您需要排他访问一个或多个数据结构以执行一系列操作或本质上不是线程安全的操作的任何情况。 AtomicXxx类型不支持这种事情。


我希望能够告诉他们不要使用该关键字,除非他们将其部署到古老的硬件上。

不要告诉他们。 不正确 实际上,如果您不熟悉Java线程,建议您在开始为人们提供建议之前,先阅读Goetz等人的“ Java Concurrency in Practice”。

取决于您正在执行的操作-如果仅需要原子提供的功能,那么可以,您将不需要自己做相同的工作(使用synced关键字)。 但是,许多多线程应用程序的工作要复杂得多,而不仅仅是原子地递增一个数字。

例如,您可能需要完成一个工作单元,在其中修改内存中的多个数据结构,并且所有这些结构都必须在没有干扰的情况下发生-您可以为此使用同步函数或块。

据我了解,synced关键字实际上是一个中等重量级的递归(重入)锁。

例如,以下(可怕的)代码不会死锁:

public static Object lock = new Object();

int recurCount = 0;

public int fLocktorial(int n) {
    synchronized(lock) {
        recurCount++;
        if (n <= 0)
            return 1;
        return n * fLocktorial(n-1);
    }
}

要实现此功能,需要在锁内维护其他状态和逻辑,这可能会导致其在原子和其他原语之上的较低性能。 但是,它确实允许您在函数内部任意获取锁,而不必担心调用者是否已获得该锁。 在这种情况下,使用Atomics天真的实现的锁将死锁。

此外,如果在锁内完成大量处理,则同步可能会带来性能优势。 获得锁只会降低性能一次,而原子会强制每个操作进行一次核心同步。 这会冲洗处理器管线,从而影响性能。

从概念上讲,受锁定状态保护的关键部分从一个有效状态转换为另一个有效状态。

int x, y;  // invariant: x==y

void inc()
    synchronized(lock)
        x++;
        y++;

void dec()
    ...

我们可以将状态封装在一个对象中,并以原子方式更改该对象。

class State
    final int x, y;
    State(int x, y) { ... }

volatile State state;

void inc()
    do
        State s = state;
        State s2 = new State(s.x+1, s.y+1);
    while( ! compareAndSet( "state", s, s2) )  // use Unsafe or something

那个更好吗? 不必要。 它很有吸引力,而且当状态变得更加复杂时它也更简单。 但在大多数情况下,速度可能会较慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM