转载地址: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

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

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

  1. Java多线程--JDK并发包(2)

    Java多线程--JDK并发包(2) 线程池 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. JDK有一套Executor框架,大概包括Executor.Ex ...

  2. Java多线程--JDK并发包(1)

    Java多线程--JDK并发包(1) 之前介绍了synchronized关键字,它决定了额一个线程是否可以进入临界区:还有Object类的wait()和notify()方法,起到线程等待和唤醒作用.s ...

  3. (转载)关于java多线程web服务器 以及相关资料转载

    1.自己实现的简单的java多线程web服务器: https://blog.csdn.net/chongshangyunxiao321/article/details/51095149 自己实现一个简 ...

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

    一:HashMap--->底层存储的是Entry<K,V>[]数组--->Entry<K,V>的结构是一个单向的链表static class Entry<K, ...

  5. Java多线程之并发包,并发队列

    目录 1 并发包 1.1同步容器类 1.1.1Vector与ArrayList区别 1.1.2HasTable与HasMap 1.1.3 synchronizedMap 1.1.4 Concurren ...

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

    一:信号量的编程模型 package com.yeepay.sxf.test.atomic.test; import java.util.concurrent.Semaphore; /** * 测试信 ...

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

    写锁降级为读锁,但读锁不可升级或降级为写锁. 锁降级是为了让当前线程感知到数据的变化. //读写锁 private ReentrantReadWriteLock lock=new ReentrantR ...

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

    一:读写锁解决的场景问题--->数据的读取频率远远大于写的频率的场景,就可以使用读写锁.二:读写锁的结构--->用state一个变量.将其转化成二进制,前16位为高位,标记读线程获取锁的次 ...

  9. java多线程:并发包中ReentrantLock锁的公平锁原理

    一:锁的原理结构 (1)锁对象内部维护了一个同步管理器的对象AbstractQueuedSynchronizer,AbstractOwnableSynchronizer (2)该对象其实是一个抽象类, ...

  10. 《java多线程编程核心技术》(一)使用多线程

    了解多线程 进程和多线程的概念和线程的优点: 提及多线程技术,不得不提及"进程"这个概念.百度百科对"进程"的解释如下: 进程(Process)是计算机中的程序 ...

随机推荐

  1. Introduction to Machine Learning

    Chapter 1 Introduction 1.1 What Is Machine Learning? To solve a problem on a computer, we need an al ...

  2. WPF如何实现类似iPhone界面切换的效果(转载)

    WPF如何实现类似iPhone界面切换的效果 (version .1) 转自:http://blog.csdn.net/fallincloud/article/details/6968764 在论坛上 ...

  3. OD调试4--绕过nag窗口

    先看一下程序的运行情况 先跳出了一个nag窗口 点确定 又跳出了一个NAG窗口,这是一些程序编写的时候常用的方法,设法让你购买正版软件, 于是今天呢,学会了四种绕过NAG的方法 我们先用OD加载进入这 ...

  4. 破解 RCA_CRACKME(解除隐藏按钮)

    系统 : Windows xp 程序 : RCA_CRACKME 程序下载地址 :http://pan.baidu.com/s/1bnoOQ6 要求 : 注册机编写 使用工具 : IDA Pro &a ...

  5. WPF Step By Step 完整布局介绍

    WPF Step By Step 完整布局介绍 回顾 上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当 然这些都是本人在实际项目中的 ...

  6. [转]Golang- import 导入包的语法

    http://blog.csdn.net/zhangzhebjut/article/details/25564457 一 包的导入语法      在写Go代码的时候经常用到import这个命令用来导入 ...

  7. CentOS 6.6 FTP install

    /************************************************************************* * CentOS 6.6 FTP install ...

  8. LeetCode Kth Smallest Element in a BST(数据结构)

    题意: 寻找一棵BST中的第k小的数. 思路: 递归比较方便. /** * Definition for a binary tree node. * struct TreeNode { * int v ...

  9. LeetCode Bulls and Cows (简单题)

    题意: 给出两个数字,输出(1)有多少位是相同的(2)有多少位不在正确的位置上. 思路: 扫一遍,统计相同的,并且将两串中不同的数的出现次数分别统计起来,取小者之和就是第2个答案了. class So ...

  10. LeetCode Find the Duplicate Number 找重复出现的数(技巧)

    题意: 有一个含有n+1个元素的数组,元素值是在1-n之间的整数,请找出其中出现超过1次的数.(保证仅有1个出现次数是超过1的数) 思路: 方法一:O(nlogn).根据鸽笼原理及题意,每次如果< ...