gpt4 book ai didi

java - synchronized方法修改后所有java线程都会看到共享资源更新吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:25 24 4
gpt4 key购买 nike

如果对一对数据结构的所有访问总是包含在锁的获取和释放中(特别是,对数据结构的任何修改使用静态同步方法)。例如:

public static synchronized Item doIt() {
// remove something from data structure 1
// add the removed item to data structure 2
// return removed item
}

我知道同步方法一次只会强制一个线程执行更新,但是当一个线程退出该方法时,是否保证其他线程可以看到更新的数据结构,或者我是否仍然需要专门的并发该保证的数据结构?

编辑:

这是我正在尝试做的一个更好的例子:

private static final List<Item> A;
private static final HashMap<Integer,Item> B;

public static Item doSomething() {
// some stuff ...
Item item = doIt();
// some other stuff ...
return item;
}

private static synchronized Item doIt() {
Item theItem = A.remove( A.size()-1 );
B.put( theItem.getId(), theItem );
return theItem;
}

最佳答案

,如果访问总是包含在同步方法/ block 中。

这是因为,synchronized 在同步方法/ block (在同一对象上)之间建立了一个happens-before 关系。引自 Synchronized Methods in the Java Tutorial :

Second, when a synchronized method exits, it automatically establishes a happens-before relationship with any subsequent invocation of a synchronized method for the same object. This guarantees that changes to the state of the object are visible to all threads.

但是,将所有访问真正包装在同步块(synchronized block)中很重要。例如,如果您要从这样的同步方法返回对列表的引用

public synchronized List<Object> GetList() {
return this.myList;
}

并在同步方法之外使用列表,您将得不到保证!

关于java - synchronized方法修改后所有java线程都会看到共享资源更新吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142526/

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