CopyOnWriteArraylist的启发

来源:互联网 发布:辣妈拾宝 淘宝达人 编辑:程序博客网 时间:2024/05/31 19:09

之前看了这种典型的读写分离的集合类,自认为了解了。回首在看,其实有很多东西还都不了解。
先说下这个集合的功能作用。假设现在有两个线程,一个线程读取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();    }}
原创粉丝点击