Java并发编程实战 第4章 对象的组合

2023-08-11  本文已影响0人  kaiker

1、设计线程安全的类

2、实例封闭

将数据封装在对象内部,可以将数据访问限制在访问对象的方法上,从而更容易确保线程在访问数据时总能持有正确锁。

Java监视器模式

public class PrivateLock {
    private final Object myLock = new Object();
    void someMethod() {
        synchronized(myLock) {}
    }
}

3、线程安全性的委托

4、在现有线程安全类中添加功能

下面第一个例子没有在list上同步

public class ListHelper<E> {
    public List<E> list = Collections.synchronizedList(new ArrayList<E>());

    public synchronized boolean putIfAbsent(E x) {
        boolean absent = !list.contains(x);
        if (absent) list.add(x);
        return absent;
    }
}

最好的方式是使用组合,在对象本身上进行同步。

public class ImprovedList<T> implements List<T> {
    private final List<T> list;

    public ImprovedList(List<T> list);

    public synchronized boolean putIfAbsent(T x) {
        boolean contains = list.contains(x);
        if (contains) list.add(x);
        return !contains;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读