gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:34:47 24 4
gpt4 key购买 nike

对于以下示例:

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) 时,就会出现问题。然后两个线程都到达 A 点,并生成 Car#2 的两个实例。如何让第二个线程在 A 点等待,直到第一个线程完成创建,然后在两次调用中返回相同的对象? (我在 Android 中执行此操作)

谢谢

最佳答案

正确的方法是在某处添加一个synchronized部分,以确保只有一个线程可以同时进入该 block 。

您具体询问了POINT A,以便您可以同步createCarWithId

public synchronized Car createCarWithId(int id){

这将锁定具有该方法的对象的 this。这是关于 synchronized methods 的一些文档.

但是,您需要保护将 Car 添加到缓存在缓存中查找它,因为多个线程将同时使用缓存。因此,您还需要使 findCarInCache synchronized。另外,由于您不想在 getCar 中锁定两次,因此它也应该同步:

public synchronized Car getCar(int id){
...
public synchronized Car findCarInCache(int id){
...
public synchronized Car createCarWithId(int id){

如果您想缩小锁的范围,作为替代方案,您可以创建一个可以同步的锁对象:

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 的更多文档.

关于Java在另一个线程中等待一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10386795/

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