返回信息流以下是原类,但是从方法的粗细粒度方面考虑,可以优化为下面的代码
```Java
public class Grocery {
private final ArrayList fruits = new ArrayList();
private final ArrayList vegetables = new ArrayList();
public synchronized void addFruit(int index, String fruit) {
fruits.add(index, fruit);
}
public synchronized void removeFruit(int index) {
fruits.remove(index);
}
public synchronized void addVegetable(int index, String vegetable) {
vegetables.add(index, vegetable);
}
public synchronized void removeVegetable(int index) {
vegetables.remove(index);
}
}
```
这是一条镜像帖。来源:北邮人论坛 / java / #62331同步于 2019/7/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】【已解决】Java并发中方法的粗细粒度问题
xiaoxiaohai
2019/7/16镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
```Java
public class Grocery {
private final ArrayList fruits = new ArrayList();
private final ArrayList vegetables = new ArrayList();
public void addFruit(int index, String fruit) {
synchronized(fruits) fruits.add(index, fruit);
}
public void removeFruit(int index) {
synchronized(fruits) {fruits.remove(index);}
}
public void addVegetable(int index, String vegetable) {
synchronized(vegetables) vegetables.add(index, vegetable);
}
public void removeVegetable(int index) {
synchronized(vegetables) vegetables.remove(index);
}
}
```
例子来自于Java并发网,附上原链接http://ifeve.com/concurrency-optimization-reduce-lock/
主要问题是:我也没看出优化在哪里,有粗细粒度上的优势?
【 在 buyaogaosuta 的大作中提到: 】
: 锁的对象不一样
: 一个是Grocery实例的锁,一个是fruits的锁
QAQ~~~这样理解一开始我还真没想到[ema21]。使用同步代码块的方法synchronized(instance){...},锁的对象是显示给出的,原来如此。。
【 在 Zx525 的大作中提到: 】
: 是不是后一种写法的一个Grocery实例可以同时addFruit()和addVegetable()
对的,“锁即对象”,对象不同,锁也不同,自然可以访问和写。
前一种写法的锁是直接对this上锁,导致四个方法都不能同时进行;后一种写法的锁有两个,结果是每个ArrayList的操作是独立出来的,对fruit操作不会影响vegetable,也就是细化了锁的粒度,提高了性能