您的位置:首页 > 编程语言 > Java开发

Java并发解决方案 java.util.concurrent

2017-08-22 12:54 232 查看
多线程编程是很美好同时又很复杂的一件事情。美好在于它能有效提高对CPU资源利用率,并且可以较快的得到结果,但同时复杂、晦涩的逻辑关系常常令程序员头疼不已。幸好在JDK1.5以后sun公司提供了java.util.concurrent包,使我们的并发编程的负担大大降低。下面我就简明扼要介绍这个包。

1.为我们提供了线程池框架->Executor.

Executor框架是这个包中最大的亮点,它为我们写好了线程池的实现,我们只需要使用Executors提供的方法进行静态调用即可,当然也可以使用ThreadPoolExecutor和ScheduledThreadPoolExecutor进行构造调用。

下图为Executor框架的UML图



从上图可以看出,Executor使用工厂模式进行设计,在Executor接口中只有execute()方法,ExecutorService接口是对上层接口Executor的包装,AbstrarctExecutorService实现了ExecutorService的方法,而ThreadPoolExecutor和ScheduledThreadPoolExecutor是对外提供的API。

其中Executors类里面有三个主要的方法。

(1) public static ExecutorService newSingleThreadExecutor()返回新创建的单线程执行程序。返回的线程不能重新配置使用。

(2) public static ExecutorService newCachedThreadPool() 返回新创建的线程池,将重用以前构造的线程(如果有) 如果没有现有的线程可用,一个新的线程将被创建并添加到池中。

(3)  public static ExecutorService newFixedThreadPool(int nThreads)返回新创建固定数目的线程池。在任何时候,至多nThreads 个线程将处于活动状态。

2.在concurrent.atomic下提供了各种原子操作类。包括AtomicBoolean、AtomicInteger等。原子操作是线程安全的,因为原子操作作为最小单元操作行为,它是不可以被分割的。以往被synchronized修饰的代码块,就可以看做是一次原子操作

3.concurrent.locks为我们提供了显式控制进程同步的类。以往的我们控制线程同步的方式,大多数情况下是使用synchronized修饰的同步方法或者同步代码块,我们不会知道jvm在何时上的锁,又在何时释放锁,所以这是隐式上锁。使用Lock我们可以直观的看到上锁、释放锁。

就如同这样

Lock lock = new ReentrantLock()
try{
lock.lock();
dosometing....
}finally{
lock.unlock();
}这种显式上锁、释放锁虽然比较直观,但是相对于synchronized方式显然增加了代码量,并且一定要释放锁,否则这块
代码会一直处于上锁的状态。

4.提供了大量的、线程安全的、可以在并发环境下使用的容器,比如ConcurrentHashMap、CopyOnWriteArrayList、

CopyOnWriteArraySet、ArrayBlockingQueue,这些类的迭代器是fail-safe(安全失败),即在一个线程迭代容器元素时 另一个线程操作本容器(

修改、删除..)不会造成java.util.ConcurrentModificationException(同步修改异常)。

5.提供了大量同步环境下使用的工具类,比如CountDownLatch(计数器)、CyclicBarrier(调度线程)、TimeUnit(时间工具类)等等,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息