作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于以下示例:
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/
我是一名优秀的程序员,十分优秀!