java - 如何安全地设置/获取Java中的字符串?

标签 java string thread-safety immutability reentrantlock

我已经读过 Java String 类是不可变的且线程安全的,但我仍然对 Strings 的引用分配是否是线程安全的感到困惑。

第一个问题:如果线程A调用Foo.setString(),而线程B调用Foo.getString(),则以下代码线程-安全的?

Class Foo {
    String aString;
    public String getString() {
        return aString;
    }
    public void setString(s) {
        aString = s;
    }
}

第二个问题:如果上面的代码不是线程安全的,使用ReentrantLock,我该如何编写Foo.getString()方法?

Class Foo {
    String aString;
    ReentrantLock aLock;
    public String getString() {
        aLock.lock();
        return aString;
        aLock.unlock(); // This line will be unreachable. How to fix??
    }
    public void setString(s) {
        aLock.lock();
        aString = s;
        aLock.unlock();
    }
}

我必须使用 ReentrantLock,因为我需要使用 tryLock(timeout) 功能。

最佳答案

问题1: 这取决于你所说的线程安全是什么意思,Eric Lippert wrote a very good blog post about it here ... 但是将 aString 声明为 volatile 将意味着不同线程上的任何读取都保证是正确的。

问题2:

使用 try...finally 构造,在 finally block 中解锁,例如:

public String getString() {
  try {        
    aLock.lock();
    return aString;
  } finally {
    aLock.unlock();
  }
}

public void setString(s) {
  try {        
    aLock.lock();
    aString = s;
  } finally {
    aLock.unlock();
  }
}

关于java - 如何安全地设置/获取Java中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113496/

相关文章:

multithreading - 如何在iOS中正确关闭WebRTC peerConnection?

java - 使用额外参数扩展所有方法而不声明它们

java - 如何将某个位置的字符替换为某个字母

java - JZOS 批量启动器 - 使用 SYSIN DD 中的 java 源代码运行 JCL 作业 *

python - 如何避免比较列表中的重复字符串

vb.net - 如何将 String.Filter 与多值参数一起使用

java - Struts2如何在没有线程的情况下获得性能?

java - createTempFile 是线程安全的吗?

java - Apache FOP 1.0 多线程 - 打开的文件太多 err24

java - JDBC/结果集错误