Ele*_*ill 5 java concurrency multithreading
我到处都读过,如果一个字段由不同的线程同时使用,则需要某种同步,如果只有一个线程使用它,则不需要它.但是,如果它被不同的线程使用,但不能同时使用呢?我们来看一下这样的代码:
Thing thing = new Thing();
Thread t1 = new Thread(new MyRunnable(thing));
Thread t2 = new Thread(new MyRunnable(thing));
t1.start();
t1.join();//Wait for t1 to finish
t2.start();
Run Code Online (Sandbox Code Playgroud)
MyRunnable是:
class MyRunnable implements Runnable {
//skipped constructor and field "private final Thing thing"
public void run() {
thing.someUpdate();
}
}
Run Code Online (Sandbox Code Playgroud)
安全吗?是否t1可以看到t1所做的所有更新?
在这种情况下,更改是可见的,因为Thread.join并Thread.start创建两个线程中的操作之间的发生之前的关系.请参阅内存一致性错误:
当一个语句调用Thread.start时,与该语句之前发生关系的每个语句也与新线程执行的每个语句都有一个before-before关系.新线程可以看到导致创建新线程的代码的影响.
当一个线程终止并导致另一个线程中的Thread.join返回时,终止线程执行的所有语句与成功连接后的所有语句都有一个before-before关系.现在,执行连接的线程可以看到线程中代码的效果.
如果您未按此顺序使用这些方法,则可能无法看到更改.线程不需要同时运行以引起问题,因为值可以缓存在线程中,或者可能发生某些优化等.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |