我有一個類的管理器,將被多個線程同時訪問,我想知道我是否以正確的方式做到了這一點?
還我想我需要RemoveFoo是原子,但我不知道java線程安全代碼+原子方法問題
public class Manager
{
private ConcurrentHashMap<String, Foo> foos;
//init in constructor
public RemoveFoo(String name)
{
Foo foo = foos.Get(name);
foo.RemoveAll();
foos.Remove(name);
}
public AddFoo(Foo foo)
{...}
}
public class Foo
{
private Map<String,Bar> bars;
//intialize it in constructor
//same for RemoveBar
public void AddBar(Bar bar)
{
synchronized(this)
{
bars.put(bar.id, bar);
}
}
public void RemoveAll()
{
synchronized(this)
{
//some before removall logic for each one
bars.remove(bar.id, bar);
}
}
}
public class Bar
{}
我不知道Java,但在C#中成規鎖同步的一些私人的事情,所以這是不是最好的挑... – Peter
其實,它不併使它所以將減緩進入的Foo下來。 @Aaron指出,你確實需要檢查foo上的空值。 – Robin