java.util.concurrentJDK的一个包存放都是关于并发的工具类CopyOnWriteArrayList往一个容器中添加元素的时候不直接往当前容器中添加而是将当前容器进行复制向新容器中添加元素添加完成之后再将原容器的引用指向新的容器。线程安全Collections.synchronizedList(new ArrayList())写多CopyOnWriteArrayList读多写少线程安全ArrayListpublicclassTest{publicstaticvoidmain(String[]args){// ListString list Collections.synchronizedList(new ArrayList());// ListString list new ArrayList();ListStringlistnewCopyOnWriteArrayList();for(inti0;i10;i){newThread(()-{list.add(a);System.out.println(list);}).start();}}}CountDownLatch减法计数器JUC的工具类可以用来倒计时当两个线程同时执行时如果我们要确保一个线程优先执行设置一个计数器当计数器清零的时候再执行另一个线程publicclassCountDownLatchTest{publicstaticvoidmain(String[]args){CountDownLatchcountDownLatchnewCountDownLatch(100);newThread(()-{for(inti0;i100;i){System.out.println(i);countDownLatch.countDown();}}).start();try{countDownLatch.await();//使用await阻塞起来等countDown清空才往下走}catch(InterruptedExceptione){thrownewRuntimeException(e);}for(inti0;i100;i){System.out.println(i);}}}CyclicBarrier加法计数器publicclassCyclicBarrierTest{publicstaticvoidmain(String[]args){CyclicBarriercyclicBarriernewCyclicBarrier(10,newRunnable(){Overridepublicvoidrun(){System.out.println(完成);}});for(inti0;i10;i){intfinalIi;newThread(()-{System.out.println(finalI);try{cyclicBarrier.await();}catch(InterruptedException|BrokenBarrierExceptione){thrownewRuntimeException(e);}}).start();}}}Semaphore计数信号量实际开发中主要用来完成限流操作即限制可以访问某些资源的线程数量。初始化 获得许可 释放publicclassSemaphoreTest{publicstaticvoidmain(String[]args){SemaphoresemaphorenewSemaphore(5);// 初始化for(inti0;i10;i){newThread(()-{try{semaphore.acquire();//获得许可System.out.println(进来了Thread.currentThread().getName());TimeUnit.SECONDS.sleep(2);System.out.println(出去了Thread.currentThread().getName());}catch(InterruptedExceptione){thrownewRuntimeException(e);}finally{semaphore.release();//释放}},String.valueOf(i)).start();}}}ReentrantReadWriteLock读写锁功能也是为了实现线程同步只不过粒度更细可以分别给读和写操作设置不同的锁机制。接口ReadWriteLock实现类ReentrantReadWriteLock可以多线程同时读但是同一时间只能有一个线程进行写操作publicclassReadWriteLockTest{publicstaticvoidmain(String[]args){CachecachenewCache();for(inti0;i10;i){intfinalIi;newThread(()-{cache.write(finalI,String.valueOf(finalI));}).start();}for(inti0;i10;i){intfinalIi;newThread(()-{cache.read(finalI);}).start();}}}classCache{privateMapInteger,StringcachenewHashMap();ReadWriteLockreadWriteLocknewReentrantReadWriteLock();publicvoidwrite(Integerkey,Stringvalue){readWriteLock.writeLock().lock();System.out.println(key开始写入);cache.put(key,value);System.out.println(key写入完毕);readWriteLock.writeLock().unlock();}publicvoidread(Integerkey){readWriteLock.readLock().lock();System.out.println(key读取开始);cache.get(key);System.out.println(key读取完毕);readWriteLock.readLock().unlock();}}
阅读完成 · 觉得有帮助?