对于以下示例:
public Car getCar(int id){
Car result= findCarInCache(id);
if (result==null){
// POINT A
return createCarWithId(id);
} else {
return result;
}
}
public Car findCarInCache(int id){
// Do something for find a car with this id in the cache
}
public void addToCache(Car car){
// Add the car to the cache
}
public Car createCarWithId(int id){
Thread.sleep(10000);
Car result= new Car(id);
addToCache(Car);
return result;
}
当两个线程同时调用getCar(2)时出现问题。然后两个线程都到达POINT A,并生成Car#2的两个实例。如何让第二个线程在POINT A等待,直到第一个线程完成创建,然后在两个调用中返回相同的对象? (我在Android中这样做)
由于
答案 0 :(得分:6)
正确的方法是在某处添加synchronized
部分,以确保只有一个线程可以同时进入该块。
您具体询问了POINT A
,因此您可以同步createCarWithId
。
public synchronized Car createCarWithId(int id){
这将锁定具有该方法的Object的this
。以下是synchronized
methods的一些文档。
但是,您需要保护Car
添加到缓存和在缓存中找到它,因为多个线程将同时使用缓存。因此,您还需要制作findCarInCache
synchronized
。此外,由于您不想在getCar
中锁定两次,因此它也应该是synchronized
:
public synchronized Car getCar(int id){
...
public synchronized Car findCarInCache(int id){
...
public synchronized Car createCarWithId(int id){
如果您想减少锁定范围,可以创建一个可以synchronize
开启的锁定对象:
private final Object lockObject = new Object();
...
public Car getCar(int id){
synchronized (lock) {
...
}
}
public Car findCarInCache(int id){
synchronized (lock) {
...
}
}
public Car createCarWithId(int id){
synchronized (lock) {
...
}
}
以下是lock objects的更多文档。