gpt4 book ai didi

java - 线程的 String 字段上的 getter 和 setter 是否必须同步/

转载 作者:行者123 更新时间:2023-11-30 11:07:15 25 4
gpt4 key购买 nike

我正在制作一个 Runnable,它将做一些独立的工作,但它的进度将由其他线程跟进。

为了做到这一点,我放置了一个包含线程“状态”的私有(private)字符串字段。该线程将使用此字段的 setter 更新其进程,而其他线程将使用 getter 检索状态。目前,我编写了以下代码并使用锁来同步我的 getter 和 setter。但我想知道是否有必要。

我想我的问题可以总结为:“在 Java 中做作是原子的吗”

提前谢谢你,如果你花时间阅读我的问题。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class FollowedThread implements Runnable {
private String state;
private final Lock lock;

public FollowedThread() {
lock = new ReentrantLock();
}

public void setState(String state) {
lock.lock();
try {
this.state = state;
} finally {
lock.unlock();
}
}

public String getState() {
String result;
lock.lock();
try {
result = state;
} finally {
lock.unlock();
}

return result;
}

@Override
public void run() {
setState("Step 1 running");
try {
Thread.sleep(1000);
setState("Step 2 running");
Thread.sleep(2000);
setState("Step 3 running");
Thread.sleep(3000);
setState("Thread finished");
} catch (InterruptedException e) {
setState("Thread interrupted");
}
}
}

最佳答案

我想我找到了答案。为了确保对字段的原子访问,您必须声明它 volatile .有了它,我的代码变成了:

package com.afklm.myactu.util;

public class FollowedThread implements Runnable {
private volatile String state;

public void setState(String state) {
this.state = state;
}

public String getState() {
return state;
}

@Override
public void run() {
setState("Step 1 running");
try {
Thread.sleep(1000);
setState("Step 2 running");
Thread.sleep(2000);
setState("Step 3 running");
Thread.sleep(3000);
setState("Thread finished");
} catch (InterruptedException e) {
setState("Thread interrupted");
}
}
}

关于java - 线程的 String 字段上的 getter 和 setter 是否必须同步/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988700/

25 4 0
文章推荐: ios - Alamofire:参数未传递到服务器
文章推荐: javascript - 为什么