java多线程:jdk并发包的总结(转载)

转载地址:http://blog.csdn.net/yangbutao/article/details/8479520

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)非并发包中的集合容器,

Collection

|---List

|--ArryList,Vector(thread safe),Linklist

|--Set

|---HashSet

|---Map

         |----HashMap(数组,每个元素是hashentry,利用哈希,定位对象存储的位置index,便于快速定位对象;hash冲突的解决采用链表结构存储)

|----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

   |---ExecutorService

          |---ThreadpoolExecutor  线程池执行Runnable

 Future    future=ThreadpoolExecutor.submit(Runnable run)

                future.cancel();

 

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 

 有些内容待细化和补充....

时间: 2024-08-23 19:50:44

java多线程:jdk并发包的总结(转载)的相关文章

java多线程和并发包入门示例_java

一.java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题. java多线程,传统创建线程的方式有两种. 1.继承自Thread类,覆写run方法. 2.实现Runnable接口,实现run方法. 启动线程的方法都是调用start方法,真正执行调用的是run方法.参考代码如下: 复制代码 代码如下: package com.jack.thread; /** * 线程简单演示例子程序 *  * @author pinefantasy * @since 2013-

java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比

一:HashMap--->底层存储的是Entry<K,V>[]数组--->Entry<K,V>的结构是一个单向的链表static class Entry<K,V> implements Map.Entry<K,V> {        final K key;        V value;        Entry<K,V> next;        int hash;         /**         * Creates ne

java多线程:并发包中的信号量和计数栓的编程模型

一:信号量的编程模型 1 package com.yeepay.sxf.test.atomic.test; 2 3 import java.util.concurrent.Semaphore; 4 5 /** 6 * 测试信号量 7 * 相当于有一把可以控制并发量的锁. 8 * 例如银行柜台,只有两个窗口.但三个人做业务,只允许同时有两个人能进行做业务 9 * 10 * 多线程 11 * @author sxf 12 * 13 */ 14 public class TestSemaphore {

java多线程:并发包中ReentrantReadWriteLock读写锁的锁降级模板

写锁降级为读锁,但读锁不可升级或降级为写锁. 锁降级是为了让当前线程感知到数据的变化. 1 //读写锁 2 private ReentrantReadWriteLock lock=new ReentrantReadWriteLock(); 3 //读锁 4 private ReadLock readLock=lock.readLock(); 5 //写锁 6 private WriteLock writeLock=lock.writeLock(); 7 private boolean updat

java多线程:并发包中ReentrantReadWriteLock读写锁的原理

一:读写锁解决的场景问题--->数据的读取频率远远大于写的频率的场景,就可以使用读写锁.二:读写锁的结构--->用state一个变量.将其转化成二进制,前16位为高位,标记读线程获取锁的次数.后16位为低位,标记写线程获取锁的次数.--->读写锁需要解决的冲突:读/写冲突,写/写冲突.读/读之间无冲突.--->当有写线程获取锁的时候.state的二进制表现,低位有数字,高位全是0.当有读线程获取锁的时候,state的二进制表现,低位全是0,高位有数字.--->如何获取读线获取

《Java多线程编程核心技术》——1.2节使用多线程

1.2 使用多线程想学习一个技术就要"接近"它,所以在本节,首先用一个示例来接触一下线程.一个进程正在运行时至少会有1个线程在运行,这种情况在Java中也是存在的.这些线程在后台默默地执行,比如调用public static void main()方法的线程就是这样的,而且它是由JVM创建的.创建示例项目callMainMethodMainThread,创建Test.java类.代码如下: package test; public class Test { public static

40个Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不

Java多线程知识小抄集(四)——完结

本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为"小抄集".本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆. 更多内容可以查阅: Java多线程知识小抄集(一) Java多线程知识小抄集(二) Java多线程知识小抄集(三) 68. 如何避免死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们都将无法推进下去.这是一个严重的问题,因为死锁会让你的程序挂起无法完成

分享40个Java多线程问题小结_java

Java多线程是什么 Java提供的并发(同时.独立)处理多个任务的机制.多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级.依我的理解,Java多线程完全就是为了提高CPU的利用率.Java的线程有4种状态,新建(New).运行(Runnable).阻塞(Blocked).结束(Dead),关键就在于阻塞(Blocked),阻塞意味着等待,阻塞的的线程不参与线程分派器(Thread Scheduler)的时间片分配,自然也就不会使用到CPU.多线程环

Java多线程:“基础篇”01之基本概念

多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容 ,是对"JDK中新增JUC包"之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的 wait(), notify()等接口:Thread类中的接口:synchronized关键字. 注:JUC包是指,Java.util.concurrent包,它是由Java大师Doug Lea完成并在JDK1.5版本添加到 Java中的. 在进入后面章节的学习之前,先对了解一些多线程的相关概念