本帖最后由 gaoht 于 2010-08-05 10:44:18 编辑

解决方案 »

  1.   

    可以使用Vector实现,Vector是线程同步的,你看看Api
      

  2.   

    定义一个全局静态变量 boolean is_writing
    当这个值为true时,不能读或者写,为false时,可以读和写
    当写线程要开始写东西时把这个值设置为true,写完之后再重新设置为false
      

  3.   

    简单的话,给读、写方法加synchronized关键字就可以做到,只是多个线程同时读时不是并发的,这样的好处是简单,如果只有一个CPU的话没有太大的影响。
    复杂的话,用synchronized, wait(), notifyAll()来做,以实现多个读线程并发。
      

  4.   

    用  synchronized关键字, public void method3(SomeObject so){
           synchronized(so)
            {
              //…..
            }
      }
      

  5.   

    可以尝试用java.util.concurrent.locks.ReentrantReadWriteLock1.有时有些数据的改变是需要原子化的来保证数据的一致性(consistency)
    2.在这种情况下,对于并发的读操作体不应该有限制
    3.但是,当写操作体获得锁之后,任何读操作体就应该阻塞知道写操作完成来保证数据的一致性
    4.ReadWriteLock就是为此而生的
    5.如果没有写操作体拥有锁,许多读操作体都可获得锁
      

  6.   


    import java.util.ArrayList;
    import java.util.List;public class ListMain {
    //利用单子模式,将list设定为唯一
    public static List<String> list;
    //设定写的线程数,每有一个写线程启动时,writerThreadCount+1;
    private int writerThreadCount=0;
    private static ListMain lm=new ListMain();
    private ListMain() {
    list=new ArrayList<String>();
    }
    public static ListMain getListMain(){
    return lm;
    }
    public int getWriterThreadCount() {
    return writerThreadCount;
    }
    public void addWriterThreadCount() {
    this.writerThreadCount++;
    }

    public void minusWriterThreadCount() {
    this.writerThreadCount--;
    }
    public static void main(String[] args) {
    ListMain lm=ListMain.getListMain();
    //判断写线程的个数,如果为2的话则退出循环
    while(lm.getWriterThreadCount()<2){
    new Thread(new ThreadWriter()).start();
    lm.addWriterThreadCount();
    }

    //每隔5秒钟起一个线程读取list中的元素
    for(int i=0;;i++){
    new Thread(new ThreadReader()).start();
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }}
    public class ThreadWriter implements Runnable {
    private List<String> list;
    private BufferedReader br;
    private ListMain lm;
    public ThreadWriter() {
    this.list=ListMain.list;
    lm=ListMain.getListMain();
    br=new BufferedReader(new InputStreamReader(System.in));
    } public void run() {
    String str;
    try {
    while((str=br.readLine())!=null){
    //将list加锁,当向list中添加数据时外部程序无法对list进行任何操作
    synchronized (list) {
    list.add(str);
    }
    }
    } catch (IOException e) {
    lm.minusWriterThreadCount();
    }finally{
    try {
    br.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }}
    public class ThreadReader implements Runnable {
    private List<String> list;

    public ThreadReader() {
    this.list=ListMain.list;
    } public void run() {
    for(String al:list){
    System.out.println("list中有数据:"+al);
    }
    }}