5同步工具类

2018-10-26  本文已影响0人  WFitz

同步容器类

常见同步类

  1. Vector

  2. Hashtable

  3. Collections.synchronizedXxx工厂方法创建的封装容器

    注:Vector和Hashtable是早期JDK的部分,Collections.synchronizedXxx是JDK1.2添加的

同步容器实现线程安全的方式

同步容器类的问题

解决复合操作线程不安全的方法

sychronized(vector) {
    for(int i=0; i<vector.size(); i++) {
        doSomething(vector.get(8));
    }   
}
public static Object getLast(Vector list) {
    synchronized(list) {
        int lastIndex = list.size() - 1;
    return list.get(lastIndex);   
    }
}

迭代器与ConcurrentModificationException

并发容器

ConcurrentHashMap与Hashtable的区别

CopyOnWriteArrayList特点

  1. 写操作复制内部容器,读操作读取的是内部容器副本,迭代时不会出现ConcurrentModificationException
  2. 适合于读操作多,写操作少的多线程环境

中断

概念

中断方法介绍

  1. isInterruputed 对象方法,获取线程的中断状态

    注:线程死了后,该方法始终返回false

  2. interrupt 对象方法,设置线程的中断状态

    注:如果线程阻塞在Object的wait方法或Thread的join、sleep方法上,调用此方法将清除被阻塞线程的中断状态,并且调用这些方法的地方将收到一个InterruptException

  3. interrupted 静态方法,返回当前线程的中断状态,并清除中断状态、

    注:线程死了后,该方法始终返回false

中断异常InterruptedException处理

同步工具类

概念

常用同步工具类

  1. CountDownLatch(闭锁)
    • 延迟线程的进度,直到其达到终止状态,所有线程将释放进度,当其到达结束状态后,将不会再改变状态
  2. FutureTask(也可以当做闭锁)
    • 可以返回计算结果的任务
    • 包括三种状态:等待运行(Waiting to run)、正在运行(Running)、运行完成(Completed)
    • 执行完成表示计算的所有结束方式:正常结束、由与取消结束、由与异常结束;任务进入完成状态后将会停止在这个状态上
    • FutureTask表示的计算通过Callable接口来实现
      • Callable可以抛出受检查的或未受检查的异常,并且任何代码都可能抛出Error
      • 无论任务代码抛出什么异常,都会被封装到一个ExecutionException中,并在Future.get中被重新抛出
      • 上面两条将使get代码变得复杂,因为不仅需要处理可能出现的ExecutionException以及未受检查的CancellationException,而且还由于ExecutionException是做为一个Throwable类返回的
    • 优点:提前启动计算,可以减少等待结果需要的时间
  3. Semaphore
    • 对资源施加边界
  4. CyclicBarrier
    • 与闭锁相同点:栅栏类似于闭锁,他能阻塞一组线程直到某个事件发生
    • 与闭锁不同点:闭锁是一次性的,栅栏可多次使用;闭锁用于等待事件,而栅栏用于等待其他线程
  5. Exchanger
    • 它是一种Two-Party栅栏,各方在栅栏位置上交换数据
上一篇 下一篇

猜你喜欢

热点阅读