之前看了这种典型的读写分离的集合类,自认为了解了。回首在看,其实有很多东西还都不了解。
先说下这个集合的功能作用。假设现在有两个线程,一个线程读取list的数据,另一个线程在线程一读取的过程中对list进行了添加。这时候如果是一般的ArrayList就有可能读取到添加的数据了。这在数据库中就是不可重复读了。为什么说有可能,而不是一定呢?自己去想!!!
数据库隔离级别链接
如果是CopyOnWriteArraylist是一定不会错误的,为什么呢?因为在线程二进行删除的时候,操作的其实不是,,,未写完。
用对象锁住方法的时候还能调用这个对象吗?
package com.zyq.trest;
import java.util.ArrayList;
import java.util.List;
class ThreadWrite implements Runnable{
public List list;
public void set(List lis) {
this.list=lis;
}
@Override
public void run() {
synchronized (list) {
list.add(4);
}
}
}
public class TestCopyOnWrite {
private static final ArrayList list;
static {
list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
}
class ThreadRead implements Runnable{
@Override
public void run() {
ThreadWrite threadWrite=new ThreadWrite();
threadWrite.set(list);
for(int i=0;i<list.size();i++) {
if(i==2) {
new Thread(threadWrite).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.err.println(list.get(i));
}
}
}
public void test() {
new Thread(new ThreadRead()).start();
}
public static void main(String[] args) {
TestCopyOnWrite testCopyOnWrite=new TestCopyOnWrite();
testCopyOnWrite.test();
}
}