1、cynchronized扩展:可重锁入ReentrantLock

  ReentrantLock是通过cas算法实现的

  RenntrantLock lock=new ReentrantLock();

  lock.lock();//如果资源被占用则会等待

  //代码锁定区域

  finally{

  //必须手动解锁

  lock.unlock();

  }

(1)中断锁

  ReentrantLock 提供了可中断锁lockInterruptibly

  lock.lockInterruptibly();//会获得锁,但是会优先相应中断

  lock.unlock();

 当当前线程终端会释放锁

 (2)显示等待锁tryLock();

  tryLock()会申请锁,如果无法获得锁,将返回false

  tryLock也可以设置尝试一段时间获取锁

 (3)公平锁 fair

  在创建ReentrantLock的时候,有一个构造方法ReentrantLock(boolean fair);默认为false,如果传入true则表示使用公平锁

2、Condition

  Condition是搭配ReentrantLock搭配使用的,用于控制当前ReentrantLock锁是否释放,是否被唤起。

  ReentrantLock lock=new ReentrantLock();

  Condition condition=lock.newCondition();

  lock.lock();

  condition.await()//会立即释放lock,进入等待状态,直到signal或者signalAll唤醒;

  //condition.awaitUninteruptily();用法与await基本相同,但是不会在等待过程中响应中断

  //锁定代码

  finally

  lock.unlock

3、信号量Semaphone,允许多个线程同时访问

  ReentrantLock和synchronized锁定之后,至允许一个线程访问,而Semaphone是允许多个线程同时访问;

  Semaphone(int permits)//permits为许可数量,允许同时有permits访问

  Semaphone(int permits,boolean fair)//fair表示是否公平

  Semaphone中的主要方法有

  acquire();尝试获得一个许可,如果无法获得,则会等待;

  release();当线程执行完成之后释放一个许可

  tryacquire();尝试获得一个许可,如果获取到返回true;否则返回false;

  tryacqurie(timeout,unit);在制定时间内尝试获得一个许可;

  acquireUninterrupt();用法与acquire一致,但是不会相应中断;

4、ReadWriteLock读写锁

  ReadWriteLock适用于大量读,少量写的操作

  读与读之间不阻塞,读与写阻塞,写与写阻塞

  ReadWriteLock就是同时只允许有一个线程写,但是多个线程可以同时读,不能一边读一边写。

  ReadWriteLock rwl=new ReadWriteLock();

  Lock readLock=wrl.readLock();

  readLock.lock();

  //代码

  readLock.unlock();

  Lock writeLock=wrl.readLock();

  writeLock.lock();

  //代码

  writeLock.unlock();

 5、CountDownLock 倒计时器

  主要用于控制等待线程,通过CountDownLock(int count);指定计数器个数,表示有count个线程执行完成之后,才能执行当前(main中的)主线程;

  通过await()检查,调用await之后当前线程会等待,知道执行完指定个数的线程;

 6、循环栅栏CyclicBarrier

  CyclicBarrier(int parties,Runable barrierAction) parties为线程数,barrierAction为线程执行完成之后的通知线程

  CyclicBarrier会集合够parties个线程之后,让他们同时执行,执行完成之后通过barrierAction通知。

  CyclicBarrier主要作用是保证parties个线程执行同步,第一次调用await方法会集合线程,第二次调用会await集体执行成功通知barrierAction

  CyclicBarrier栅栏中的某一个线程被中断,会影响其他线程的执行,会抛出BrokenBarrierException。

  问题:当CyclicBarrier中某一个线程执行过程中被中断,其他线程会执行成功吗?

7、LockSupport线程阻塞工具类

  LockSupport可以让一个线程在任何一个地方中断,功能类似与Thread的supend(挂起不释放锁)和resume(继续执行),Thread中如果resume在supend之前,会导致线程永久挂起,

使用LockSupport的pack和unpack则不会发生这种情况。LockSupport是使用信号量机制,为每个线程创建了一个许可,及时unpack执行在pack之后,unpack会创建一个许可,pack执行会消耗这个许可,会立即返回。LockSupport被中断之后是不会跑出InterruptedException,但是会同步线程状态,Thread.isInterrupted()

  

jdk并发工具包之锁的更多相关文章

  1. Java 并发工具包 java.util.concurrent 用户指南

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  2. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  3. Java 8并发工具包漫游指南

    Java 8并发工具包简介 Java 8并发工具包由3个包组成,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concur ...

  4. Java_并发工具包 java.util.concurrent 用户指南(转)

    译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本 ...

  5. Java并发机制及锁的实现原理

    同步的基本思想 为了保证共享数据在同一时刻只被一个线程使用,我们有一种很简单的实现思想,就是 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的. 当有第一个线程访问时,就 在锁里保存这个线程的标识 ...

  6. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  7. Java进阶7并发优化4——JDK并发数据结构

    Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...

  8. Java 并发工具包 java.util.concurrent 用户指南(转)

    本文转自http://blog.csdn.net/defonds/article/details/44021605/ 感谢作者 1. java.util.concurrent - Java 并发工具包 ...

  9. Java 并发工具包 java.util.concurrent 大全

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

随机推荐

  1. bzoj 3277 串 后缀树+子树不同数个数

    题目大意 给定\(n\)个字符串和\(k\) 对于每个字符串,输出它有多少个子串至少是\(k\)个字符串的子串(包括自己) 分析 建出广义后缀自动机 至少是\(k\)个字符串的子串就是求子树内不同数个 ...

  2. kernel thread vs user thread

    The most important difference is they use different memory, the kernel mode thread can access any ke ...

  3. luogu 3406 海底高铁 前缀和

    题目链接 题意 给定一个数轴上的若干城市\(1,2,3,...,n\),在第\(i\)到\(i+1\)\((1\leq i\lt n)\)个城市间有铁路,通行方式可为 \(1.\)每次买票(花费\(a ...

  4. Scrapy学习-24-集成elasticsearch

    elasticsearch简单集成到scrapy中 使用elasticsearch的python接口处理数据  https://github.com/elastic/elasticsearch-dsl ...

  5. JavaScript 之类型转换

    数值转换成字符串类型 1.利用 “+” 将数值加上一个长度为零的空字符串. 2.通过toString()方法.加入参数可以直接进行进制的转换. <script language="ja ...

  6. C#图解教程学习笔记——转换

    一.什么是转换转换(conversion)是指接受一个类型的值并使用它作为另一个类型的等价值的过程.转换后的值应和源值是一样的,但其类型为目标类型. 二.隐式转换和显式转换(强制转换)1. 隐式转换( ...

  7. Python实现简单的Web服务器 解析

    代码来源https://www.shiyanlou.com/courses/552,对它进行理解,注释 #-*- coding:utf-8 -*- import BaseHTTPServer clas ...

  8. LeetCode OJ-- Binary Tree Maximum Path Sum ***

    https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 给一棵二叉树,路径可以从任一点起,到任一点结束,但是可以连成一个路径的.求 ...

  9. LeetCode OJ--4Sum *

    https://oj.leetcode.com/problems/4sum/ 在一个数列中,找出所有的4个数,它们的和是target. class Solution { public: vector& ...

  10. jquery中的数据传输

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...