gpt4 book ai didi

java - 在java中,线程本地缓存内存在销毁时会刷新到主内存吗???

转载 作者:行者123 更新时间:2023-12-02 03:30:23 24 4
gpt4 key购买 nike

我正在尝试设计一个使用 Executors.newSingleThreadExecutor() 制作的工作线程的 Android 应用程序

但是我只想让工作线程处理主线程发送的连续任务,同时保存属于该工作线程的一些信息。 (主线程不需要知道,只是工作线程应该在内部保留该信息。

// State saver class , once made by main thread only accessed by worker thread

public class StateSaver{

public int count;

}

// Runnable obj that will be sent to worker thread from main thread
public class rnbl implements Runnable{

final public StateSaver sv;

public rnbl(StateSaver sv){
this.sv = sv;
}

@Override
public void run(){
sv.count++;
}
}

// Main Thread

ExecutorService ex = Executors.newSingleThreadExecutor();

StateSaver sv = new StateSaver();

public void functionCalledByMainThread(){



ex.submit(new rnbl(sv));

}

但是问题是,我发现当 newSingleThreadExecutor 长时间闲置时,它可能会破坏它创建的线程,并在需要时用新线程替换它。

所以我担心的是,如果出现下面这样的情况怎么办? :

  1. 工作线程更新了状态变量

  2. 变量在线程缓存内存中更新,但尚未应用于主内存(变量不应该是 volatile 的)

  3. 工作线程被销毁

  4. 更新永远不会应用到主内存...

然后,如果执行器创建一个新线程来继续执行任务,则保存的状态可能不正确,对吗?当然,使用 volatile 这应该很容易,但我不需要使用 volatile

或者是否保证当线程被销毁时,对变量所做的所有更改都会刷新到主内存?

最佳答案

如果要确保随后终止的线程所做的更改对另一个线程可见,则可以使用 Thread.join()。这为您提供了有保证的发生之前关系。

例如:

 Thread t = new Thread(new SomeRunnable());
t.start();
// do stuff
t.join();
// After the 'join', all memory writes made by Thread t are
// guaranteed to be visible to the current thread.
<小时/>

但您实际上是在询问 ExecutorService,其中线程无法供您“加入”。

以下内存一致性保证适用于 ExecutorService:

Actions in a thread prior to the submission of a Runnable or Callable task to an ExecutorService happen-before any actions taken by that task, which in turn happen-before the result is retrieved via Future.get().

因此,获得所需一致性的方法是在任务的 Future 上调用 get()

关于java - 在java中,线程本地缓存内存在销毁时会刷新到主内存吗???,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178230/

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