gpt4 book ai didi

java - 同步工作线程使用的共享对象

转载 作者:行者123 更新时间:2023-12-01 14:38:58 25 4
gpt4 key购买 nike

我对这个主题的最后一个问题和相应的答案没有解释所有细节。所以我决定简化代码:

List<String> wis = new ArrayList<String>();
for(int i=0;i<3000;i++) {
wis.add("test_" + i);
}
DayCalc calc = new DayCalc();
List<List<String>> partition = MyPartition.partition(wis, 30);
ExecutorService executor = Executors.newFixedThreadPool(4);
for(List<String> part: partition) {
Runnable worker = new DayCalcWorker(part, calc);
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
// Execute all Threads
}

共享类对象“calc”由所有执行的线程使用:

public class DayCalc {
private static int CURRENT_DAY_OF_YEAR = DateTimes.getCurrentCalendarDay();
ArrayList<String> kwContentArray;

public DayCalc() {
kwContentArray = new ArrayList<String>();
}

private int getCurrentCalendarDay(Calendar cal) {
// Reset time to start of day (00:00)
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
// Get starting day
Calendar currentTime2 = StartDate.getStartDate();
System.out.println("Day: " + CURRENT_DAY_OF_YEAR);
System.out.println("Start Date: " + currentTime2.getTime());
int day = (int) Convert.daysBetween(currentTime2.getTime(), cal.getTime());
return day;
}

public void setValueFromWorkItem(String wiID, String duration, Calendar cal) {
if (duration != null) {
this.setDurationValues(wiID, duration, cal);
} else {
int currentDay = getCurrentCalendarDay(cal);
long time = 0;
kwContentArray.add(String.valueOf(time));
}
}

// [...]
}

线程 worker 类:

public class DayCalcWorker implements Runnable {

private List<String> wis;
private DayCalc dayCalc;
GregorianCalendar cal = new GregorianCalendar();
GregorianCalendar cal2 = new GregorianCalendar();

public DayCalcWorker(List<String> wis, DayCalc dayCalc) {
this.wis = wis;
this.dayCalc = dayCalc;
}

@Override
public void run() {
if (wis != null && wis.size() > 0) {
for(String wi: wis) {
long randomDate = System.currentTimeMillis() + Random.getValue();
cal.setTime(new Date(randomDate));
dayCalc.setValueFromWorkItem(wi, "24", cal);
}
}
}
}

问题

是否可以同步方法setValueFromWorkItemgetCurrentCalendarDay,因为它们使用例如每个工作线程只有一个本地创建的日历对象

因为类 DayCalc 中的对象 calc 是共享的,所以我只需关心在此类中创建的对象,而不是从工作线程传递的对象正在调用 calc 的方法,不是吗?

请注意,代码本身根本没有任何意义。它只是应该解释我使用需要同步的可变日历对象(也许)。

最佳答案

不,这不安全。您正在从 setValueFromWorkItem() 方法内部修改共享列表 (kwContentArray)。因此,此修改以及对此共享列表的所有其他访问(读或写)必须同步。如果适合您的需要,您还可以使用并发列表实现。

关于java - 同步工作线程使用的共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16188498/

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