最近用JAVA写多线程程序遇到几个问题1.如果多个线程同时将不同的元素add到map中,需要把这个map做原子操作吗?2.如果两个不同的线程,一个在队列中执行取元素操作,一个在队列中执行添加元素操作,需要将队列原子操作吗?

解决方案 »

  1.   

    都需要!非线程安全的集合只能用于单线程环境中,或者多线程环境中不共享的情况下。在多线程环境中并且这些集合是在多个线程之间共享的话,那就是线程不安全的,在并发量较高的情况下集合内部数据会产生错误。第一个问题,可以使用 Collections 中的方法同步这个 Map,或者使用更高效线程安全的集合类 java.util.concurrent.ConcurrentHashMap,这个 Map 由于使用了分离锁,默认最多可由 16 个线程同时进行线程安全的修改操作第二个问题:典型的生产者/消费者操作。将队列进行同步,或者使用 java.util.concurrent.LinkedBlockingQueue 进行操作