gpt4 book ai didi

Java多线程: thread safe data structure vs.同步方法

转载 作者:行者123 更新时间:2023-11-29 03:04:23 26 4
gpt4 key购买 nike

我有一个 TestLogger 类,它有一个 void 方法 log(String s),它可以被多个线程访问。这是我的代码

public class TestLogger {
private static final StringBuffer buffer = new StringBuffer();

public static void log(String s) {
buffer.append(s);
}
}

这里不确定如果使用了线程安全类StringBuffer,是否还需要在方法log(String)上加上synchronized关键字来保证线程安全的方法?还有这个方法怎么样

public static void log(String s, int type) {
if (type == 0)
buffer.append(s);
if (type == 1)
buffer.append("SOME HEADER " + s);
}

这里的类型没有在方法日志中修改。我需要使用同步关键字吗?

在Java中,既有synchronized关键字,也有线程安全类,可以提供线程安全。我不确定何时使用一个和另一个?

最佳答案

And how about this method...

您的两个方法同样是线程安全的(或不是!,请参见该行下方)。无论调用哪个方法,都会发生同样的事情:一个字符串将被添加到共享缓冲区。


使用线程安全对象并不能使程序成为线程安全的。 “线程安全”的含义由您决定。

当有人告诉您某些 是线程安全的时,他们 promise 的是,调用该类方法的多个线程不可能使它们中的任何一个行为“错误”方式。

“错误”是什么意思?这得看情况。当然,任何与类文档不一致的行为都是错误的。通常,任何不符合合理程序员预期的行为也可能被称为错误。

对于 StringBuffer,这里是“线程安全”的意思:这意味着:

  • 您不会在缓冲区中找到您的程序未放入缓冲区的任何内容。
  • 您不会从您的程序放入的缓冲区中找到任何遗漏的东西。
  • 您不会发现两个不同字符串中的字符相互交错,最后,
  • 如果您能证明字符串 A 在字符串 B 被附加之前被附加,那么字符串 A 将在字符串 B 之前出现在输出中。

您的示例方法调用是线程安全的,原因很简单,因为每个调用都仅一次调用线程安全的共享对象。

如果您的示例有多个共享对象,那么对象的各个线程安全性可能不会加起来成为整个算法的线程安全性。

关于Java多线程: thread safe data structure vs.同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com