要自定义实现一个线程安全的ArrayList,可以使用设计模式中的代理模式。代理模式可以通过创建一个代理类来控制对原始对象的访问,并在访问时添加额外的功能或限制。
下面是一个使用代理模式实现线程安全ArrayList的示例代码:
首先,定义一个接口 `List`,该接口包含ArrayList的常用方法:
```java
public interface List {
? ? void add(Object element);
? ? void remove(Object element);
? ? Object get(int index);
? ? int size();
}
```
然后,创建一个具体的实现类 `ArrayListImpl`,实现List接口:
```java
public class ArrayListImpl implements List {
? ? private java.util.List<Object> list;
? ? public ArrayListImpl() {
? ? ? ? this.list = new ArrayList<>();
? ? }
? ? @Override
? ? public void add(Object element) {
? ? ? ? list.add(element);
? ? }
? ? @Override
? ? public void remove(Object element) {
? ? ? ? list.remove(element);
? ? }
? ? @Override
? ? public Object get(int index) {
? ? ? ? return list.get(index);
? ? }
? ? @Override
? ? public int size() {
? ? ? ? return list.size();
? ? }
}
```
接下来,创建一个线程安全的代理类 `ThreadSafeArrayListProxy`,实现List接口,并在内部使用synchronized关键字来保证线程安全:
```java
public class ThreadSafeArrayListProxy implements List {
? ? private List target;
? ? public ThreadSafeArrayListProxy(List target) {
? ? ? ? this.target = target;
? ? }
? ? @Override
? ? public synchronized void add(Object element) {
? ? ? ? target.add(element);
? ? }
? ? @Override
? ? public synchronized void remove(Object element) {
? ? ? ? target.remove(element);
? ? }
? ? @Override
? ? public synchronized Object get(int index) {
? ? ? ? return target.get(index);
? ? }
? ? @Override
? ? public synchronized int size() {
? ? ? ? return target.size();
? ? }
}
```
最后,你可以使用如下方式来使用线程安全的ArrayList:
```java
List arrayList = new ArrayListImpl();
List threadSafeArrayList = new ThreadSafeArrayListProxy(arrayList);
threadSafeArrayList.add("Element 1");
Object element = threadSafeArrayList.get(0);
System.out.println(element);
```
这样,通过代理模式,我们实现了一个线程安全的ArrayList,可以在多线程环境中安全地使用。代理类在调用目标对象的方法之前添加了synchronized关键字,确保了线程安全性。