Java在另一个线程中等待一个对象

时间:2012-04-30 16:06:55

标签: java android multithreading thread-safety

对于以下示例:

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中这样做)

由于

1 个答案:

答案 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的更多文档。