在多线程中,同步访问是一个关键点,
如果我想用arraylist实现一个lock-free的无锁访问,我该怎么做?
synchronized lock这些都是是加上了锁,我想不加锁的实现多线程,应该如何做到操作之间的互斥呢?用信号量吗?还是?

解决方案 »

  1.   

    或者List list =Collections.synchronizedList(new ArrayList());这样得到的也是线程安全的数组
      

  2.   

    信号量可以,但是多线程你不加锁用ArrayList这个线程不安全的集合没法保证数据的准确性,用ConcurrentLinkedQueue这个试试吧。
      

  3.   

    楼上有理,应该使用Concurrent下的几个Queue,而不是ArrayList,Vector之类的集合对象
      

  4.   

    如果你的 ArrayList 读操作比较多,写操作比较少,也可以用 [volatile reference] + [copy on write]
      

  5.   

    传统的synchronized是对资源加锁,也就是说别的线程无法操作这个对象,但是这样效率不高,哪种情况下,我可以对对象的操作锁住,也就是说,当我在修改对象A的a属性的时候同时我的另一个线程可以修改A的b属性。
      

  6.   

    synchronized只是用你提供的对象来作为锁,你用当前对象肯定就只能一个线程里面操作,但是你可以尝试用别的对象来当锁,比如对A操作的方法自己用一个锁,对B操作方法用另一个锁,这样它们就互不影响。
      

  7.   


    莫非是说CopyOnWriteArrayList……
      

  8.   

    这样子的话还是要用到锁,我的意思是能不能用ArrayList这些不是线程安全的容器来实现Lock-free,非阻塞的
      

  9.   

    有现成的为啥一定要用ArrayList自己折腾自己呢?java开发的并发库不浪费了嘛