回顾总结一下JDK高并发的包(集合、多线程、锁)
来源:互联网 发布:阿里云 服务器托管 编辑:程序博客网 时间:2024/06/04 01:29
1、java 高并发包所采用的几个机制(CAS,volatile,抽象队列同步)
CAS(乐观操作),jdk5以前采用synchronized,对共享区域进行同步操作,synchronized是重的操作,在高并发情况下,会引起线程频繁切换;而CAS是一种乐观锁机制,compare and swap,不加锁,而是假设没有冲突去完成,若有冲突会重试(非阻塞)。compare&swap是原子操作,基于CPU的原语操作。
volatile(变量的可见性),VM阻止volatile变量的值放入处理器的寄存器,在写入值以后会被从处理器的cache中flush掉,写到内存中去,这样其他线程都可以立刻看到该变量的变化。
AQS,抽象队列同步器(原子性操作状态同步位、有序队列、阻塞唤醒进程)
获取锁:首先判断当前状态是否允许获取锁,如果是就获取锁,否则就阻塞操作或者获取失败,也就是说如果是独占锁就可能阻塞,如果是共享锁就可能失败。另外如果是阻塞线程,那么线程就需要进入阻塞队列。当状态位允许获取锁时就修改状态,并且如果进了队列就从队列中移除。
释放锁:这个过程就是修改状态位,如果有线程因为状态位阻塞的话就唤醒队列中的一个或者更多线程。
2、锁相关:
Semaphere,控制某资源同时被访问的个数的类
在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者
Semaphore position=new Semaphore(2);
position.acquire(); //阻塞,直到等待的当前的个数少于2个
position.release()
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch end = new CountDownLatch(10);
end.countDown(); 10次
end.wait阻塞直到end.countDown(); 10次
CyclicBarrier,一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
CyclicBarrier barrier = new CyclicBarrier(3);barrier.await()//三次
ReentrantLock,控制并发资源,功能上等同于synchronize
ReentrantLock lock=new ReentrantLock();
lock.lock();
lock.unlock
Condition,在同一个锁的情况下,根据不同的情况执行等待和唤醒动作,类似于object.wait、notify操作
Condition cond=ReentrantLock.newCondition();
cond.await();
cond.signal();
ReentrantReadWriteLock,
读写锁--ReadWriteLock接口及其实现类ReentrantReadWriteLock
ReentrantReadWriteLock中定义了2个内部 类, ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock, 分别用来代表读取锁和写入锁. ReentrantReadWriteLock对象提供了readLock()和writeLock()方法, 用于获取读取锁和写入锁.
- 读取锁允许多个reader线程同时持有, 而写入锁最多只能有一个writter线程持有.
- 读写锁的使用场合: 读取共享数据的频率远大于修改共享数据的频率. 在上述场合下, 使用读写锁控制共享资源的访问, 可以提高并发性能.
- 如果一个线程已经持有了写入锁, 则可以再持有读写锁. 相反, 如果一个线程已经持有了读取锁, 则在释放该读取锁之前, 不能再持有写入锁.
- 在多线程环境中,读锁和写锁是相互排斥的,一个lock不可能同时拥有读锁和写锁.
3、并发容器:
1)非并发包中的集合容器,
|----HashTable(thread safe)
2)并发包中的线程安全的集合容器
ConcurrentMap( 线程安全的hashMap),默认16个segment的数组,每个segment中实现就是hashMap了,通过hash定位segment。put操作是在segment层上加锁的,这样可以减少并发的冲突;读操作大多数情况下无锁操作(仅仅找到的hashentry对应的对象为null时,有锁操作)。
CopyOnWriteArrayList,线程安全,读操作时无锁的ArrayList;在写时,copy一个ArrayList,写完成后,指针指向新的对象。
CopyOnWriteArraySet,基于CopyOnWriteArrayList实现。
ArrayBlockQueue,基于数组,FIFO,线程安全的集合类,容量可以限制。
4、线程池:
Thread,Runable,
Callable,Future(可携带结果的任务)
Executor
Executors,提供创建ThreadpoolExecutor的工厂类,提供几种创建方法
FutureTask,主要用于异步取得执行结果和取消执行任务,Runnable
Callable callable=new Callable();
FutureTask task=new FutureTask(callable)
task.run();
task.get();
task.cancel();
线程中断,interrupt()不会中断正在执行的线程,只是将线程的标志位设置成true。但是如果线程在调用sleep(),join(),wait()方法时线程被中断,则这些方法会抛出InterruptedException,在catch块中捕获到这个异常时,线程的中断标志位已经被设置成false了,因此在此catch块中调用t.isInterrupted(),Thread.interrupted()始终都为false, 而t.isInterrupted与Thread.interrupted()的区别是API中已经说明很明显了,Thread.interrupted()假如当前的中断标志为true,则调完后会将中断标志位设置成false
有些内容待细化和补充....
- 回顾总结一下JDK高并发的包(集合、多线程、锁)
- 《Java高并发程序设计》总结--3. JDK并发包
- Java分布式应用学习笔记04JDK的并发包的集合总结
- java高并发程序设计总结三:JDK并发包之ReentrantLock重入锁
- java高并发程序设计总结四:JDK并发包之信号量Semaphore
- Java并发包多线程总结
- Java并发包多线程总结
- 关于jdk的并发集合
- 【多线程高并发】java锁的高级
- 高并发Java六 JDK并发包2
- 高并发Java五 JDK并发包1
- Java高并发程序设计 JDK并发包(上)
- 【高并发Java五】JDK并发包1
- 【高并发Java六】JDK并发包2
- [高并发Java 五] JDK并发包1
- [高并发Java 六] JDK并发包2
- 高并发Java 五 JDK并发包1
- 高并发Java 六 JDK并发包2
- html组成的图片
- BIRT报表目录
- ABAP 写数据到SAP服务器文件
- 弹性方框模型 (FLEXIBLE BOX MODEL) 快速入门
- python中的多线程技术
- 回顾总结一下JDK高并发的包(集合、多线程、锁)
- Unity 模型的制作规范
- 详解手机版 Ubuntu:创新不少 前途不明
- selinux anrdroid 说明
- 在启动Activity时,如何隐藏输入法
- C#读写文件:编码和转换(string和byte[]转换为例)
- js 截取URL中的某个参数的值
- struts2面试题
- jquery 弹出遮罩层 带自定义扩展方法 全