Lock类-ReentrantLock的使用】的更多相关文章

在Java多线程中可以使用synchronized隐式锁实现线程之间同步互斥,Java5中提供了Lock类(显示锁)也可以实现线程间的同步,而且在使用上更加方便.本文主要研究 ReentrantLock的使用. 公平锁与非公平锁:公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO顺序.而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,和公平锁不一样的就是先来的不一定先得到锁,这个方式可能造成某些线程一直拿不到锁.从这个角度讲,synchronized其实就是一种非公平…
这篇博客记录了Lock,ReentrantLock,ReentrantReadWriteLock类的使用以及其一些api: 码字不易~~另外<java多线程编程核心技术>这本书读着很爽 前言说明:之前为了解决多线程时的非线程安全问题,使用的是synchronized.接下来记录的是他的升级版本ReentrantLock,更加灵活,可控性更高,而ReentrantReadWriteLock类是对ReentrantLock类的补充,能够在某些条件之间之下提交效率 下面先来看下都有哪些api,以及和…
先来看一段代码,实现如下打印效果: 1 2 A 3 4 B 5 6 C 7 8 D 9 10 E 11 12 F 13 14 G 15 16 H 17 18 I 19 20 J 21 22 K 23 24 L 25 26 M 27 28 N 29 30 O 31 32 P 33 34 Q 35 36 R 37 38 S 39 40 T 41 42 U 43 44 V 45 46 W 47 48 X 49 50 Y 51 52 Z  package test; import java.util.c…
转会:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来总体说明. 从这一章開始花少量的篇幅谈谈锁机制. 上一个章节 中谈到了锁机制,而且针对于原子操作谈了一些相关的概念和设计思想.接下来的文章中.尽可能的深入研究锁机制,而且理解里面的原理和实际应用场合. 虽然synchronized在语法上已经足够简单了.在JDK 5之前仅仅能借助此实现,…
之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信.在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信. Lock类是Java类来提供的功能,丰富的api使得Lock类的同步功能比synchronized的同步更强大.本文章的所有代码均在Lock类例子的代码 本文主要介绍一下内容: Lock类 Lock类其他功能 Condition类 Con…
原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synchronized和Lock实现锁的功能 synchronized是java中的关键字,隐藏获取和释放锁的过程,Lock是java中的接口,需要主动的获取锁和释放锁,synchronized是排他锁,而Lock支持可中断获取锁,超时获取锁 Lock提供的接口 public interface Lock…
Lock Lock相比于synchronized具有更强大的功能,在jdk1.6之前,锁竞争激烈的情况下使用lock的实现类ReentrantLock甚至比synchronized具有更好的性能,1.6之后oracle对synchronized进行了优化,如今的jdk1.8中两者性能不相伯仲.一个工具类,没有使用机器指令,没有编译器的特殊优化,却具有和jvm层实现的关键字一样甚至更好的效率与更强大的功能. ReentrantLock 可重入锁是Lock接口的一个重要实现类.所谓可重入锁即线程在执…
一.概述 重入锁ReentrantLock,就是支持重进入的锁 ,它表示该锁能够支持一个线程对资源的重复加锁.支持公平性与非公平性选择,默认为非公平. 以下梳理ReentrantLock.作为依赖于AbstractQueuedSynchronizer. 所以要理解ReentrantLock,先要理解AQS.013-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架.独占锁与共享锁的获取与释放 aqs有多神奇,让ReentrantLock没有使用更“高级”的机器指令,…
目录 前言 synchronized用法 修饰方法 修饰实例方法 修饰静态方法 同步代码块 引出Lock Lock用法 子类:ReentrantLock 读写分离锁:ReadWriteLock Lock和synchronized比较 前言 多线程开发中,同步控制是必不可少的手段.而同步的实现需要用到锁,Java中提供了两种基本的锁,分别是synchronized 和 Lock.两种锁都非常常用,但也各有利弊,下面开始学习. synchronized用法 synchronized 是Java的关键…
synchronized:同步锁,是java内置的关键字.当一个线程A执行到被synchronized修饰的方法时,其他线程B如果也要执行这个方法,那么B只能等A执行完方法释放锁后才能获取资源锁执行synchronized方法块. synchronized释放锁的情况 1,执行完改代码块,释放锁 2,执行时发生异常,jvm自动释放 lock:是一个类,通过这个类可以实现同步访问 lock和synchronized最大不同点.lock释放锁需要手动释放,如果没有手动释放则会导致死锁的现象 而syn…
JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象. 锁是控制多个线程对共享资源进行访问的工具.通常,锁提供了对共享资源的独占访问.一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁.不过,某些锁可能允许对共享资源并发访问,如 ReadWriteLock 的读取锁. synchronized 方…
  前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明.从这一章开始花少量的篇幅谈谈锁机制. 上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设计思想.接下来的文章中,尽可能的深入研究锁机制,并且理解里面的原理和实际应用场合. 尽管synchronized在语法上已经足够简单了,在JDK 5之前只能借助此实现,但是由于是独占锁,性能却不高,因此JDK 5以后就开始借助于JNI来完成更高级的锁实现. JDK 5中的锁是接口java.uti…
Lock是顶层接口,它的实现逻辑并未用到synchronized,而是利用了volatile的可见性.ReentrantLock对了Lock接口的实现主要依赖了Sync,而Sync继承了 AbstractQueuedSynchronizer(AQS) ReentrantLock: public class ReentrantLock implements Lock, java.io.Serializable { private static final long serialVersionUID…
Lock位于java.util.concurrent.locks包下,是一种线程同步机制,就像synchronized块一样.但是,Lock比synchronized块更灵活.更复杂. 话不多说,我们直接来看官方文档对Lock接口相关概念及功能的描述,今天又是看英文文档,翻译理解的一天. 一.Lock继承关系 二.官方文档解读 三.Lock接口方法解读 void lock() 获取锁.如果锁不可用,则当前线程将出于线程调度目的而禁用,并处于休眠状态,直到获得锁为止. void lockInter…
http://www.cnblogs.com/DreamDrive/p/6192685.html 这个是用synchronized关键字实现的. Lock可以替换synchronized. 上面用来做为锁对象的SaleWindow.class没有别的操作,而且获取锁和释放锁都是在内部隐藏完成的. Java的思想是万物皆对象,我们把这种锁也描述成为一个对象,就是Lock..... Lock中的lock和unlock显式的打开和关闭(可视化)更直观. Lock实现提供了比使用synchronized…
虽然线程可以在程序的执行过程中提高程序的运行效率,但是其带来的影响却难以忽略. Lock类是threading中用于锁定当前线程的锁定类.顾名思义,其作用是对当前运行中的线程进行锁定,只有当前线程被释放后,后续线程才可以继续操作.  具体代码如下: import threading,time,random count = 0 class MyThread_lock(threading.Thread): def __init__(self,lock,threadName): super(MyThr…
Welcome to Java Lock example tutorial. Usually when working with multi-threaded environment, we use synchronized for thread safety. Java Lock Most of the times, synchronized keyword is the way to go but it has some shortcomings that lead the way to i…
#在threading模块当中定义了一个Lock类,可以方便的使用锁定: # #1.创建锁 # mutex = threading.Lock() # # #2.锁定 ''' mutex.acquire(True/False) True:如果所要获取的资源已经"锁定",表示当前线程处地等待(阻塞),直到获取到这个锁为止--默认值 False:不阻塞,即不管本次调用能够成功上锁,都不会卡在这,而是继续执行后面的代码 ''' # #3.解锁 # mutex.release() import…
Lock框架是jdk1.5新增的,作用和synchronized的作用一样,所以学习的时候可以和synchronized做对比.在这里先和synchronized做一下简单对比,然后分析下Lock接口以及ReentrantLock的源码和说明.具体的其他的Lock实现的分析在后面会慢慢介绍. 234567891011121314151617181920212223242526 public interface Lock { //获取锁,获取到锁后返回 //注意一定要记得释放锁 void lock…
synchronize 和Lock: 1.synchronize 系java 内置关键字:而Lock 是一个类 2.synchronize 可以作用于变量.方法.代码块:而Lock 是显式地指定开始和结束位置 3.synchronize 不需要手动解锁,当线程抛出异常的时候,会自动释放锁:而Lock则需要手动释放,所以lock.unlock()需要放在finally 中去执行 4.性能方面,如果竞争不激烈的时候,synchronize 和Lock 的性能差不多,如果竞争激烈的时候,Lock 的效…
下面ReentrantLock是Lock接口的具体实现 如果想在线程等待时(即等待获得锁时)可以被中断,用lockInterruptibly:注意:在线程已经获得锁正在执行时,用Synchronized和Lock加锁,都是可以被中断的 读写锁…
Java多线程 用多线程只有一个目的,就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程 并行与并发: 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时. 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时. 线程安全:经常用来描绘一段代码.指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果.这个时候使用多线程,我们只需要关注系统的内存,cpu是…
多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修改,就会导致修改的状态不一致. 用一个实际的例子来说明线程同步的必要性: package cn.outofmemory.locks; public class LockDemo implements Runnable { private int counter = 0; public void ru…
Lock与Synchronized的区别:   1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现: 2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生:而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁: 3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时…
如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能用wait().notify().notifyAll()方法进行线程通信了.当使用Lock对象来保证同步时,Java提供了Condition类来协调线程间的通信. 本示范简单模拟银行帐户的存取款活动,帐户余额大于等于取款金额时允许取款:帐户余额小于1000时允许存款(这与真实业务逻辑不符合,只是技术上需要才如此做的,否则存款一下子全存完就不好玩了). 1. 实体Ac…
ReentrantLock类是一个可重入互斥锁,它具有与使用synchronized()方法和语句访问隐式监视器锁相同的基本行为和语义,但是它的功能更强大.ReentrantLock由最近成功获得锁但是还未释放该锁的线程拥有.当锁并未被其他线程拥有时,申请锁的线程会获得该锁并返回.如果线程已经获得锁,该方法会立即返回.为了保证申请的锁能够及时释放,通常使用finally语句块的特性来释放锁. 基本结构: public class Test{ private final ReentrantLock…
jdk1.7.0_79 在java.util.concurrent.locks这个包中定义了和synchronized不一样的锁,重入锁——ReentrantLock,读写锁——ReadWriteLock等.在已经有了内置锁synchronized的情况下,为什么又出现了Lock显示锁呢?本文将以Lock作为Java并发包源码解读的开始. Lock定义最基本的加锁和解锁操作. Lock void lock(); 阻塞方式获取锁,直到获取锁后才返回 void locklnterruptibly()…
前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 Java锁机制了解一下 AQS简简单单过一遍 只有光头才能变强! 上一篇已经将Lock锁的基础AQS简单地过了一遍了,因此本篇主要是讲解Lock锁主要的两个子类: ReentrantLock ReentrantReadWriteLock 那么接下来我们就开始吧~ 一.ReentrantLock锁 首先我们来看看ReentrantLock锁的顶部注释,来看看他的相关特性呗: 来总结一…
在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行,否则出现死锁现象. lockInterruptibly()方法介绍: 此方法返回的为获取锁的方法,但是当线程调用了interrupt()方法后,此方法将会返回一个异常,导致线程的中断.即线程中断. 代码实例如下: package TestThread.ThreadLockDemo; import j…
实现了lock的类为:ReentrantLock 接口的方式解释: lock()方法为获取锁对象,如果未获取到锁就一直获取锁. trylock():为布尔值,返回是否获取到了锁,如果没有获取到锁则返回false,如果获取到了则返回true tryLock(long timeout, TimeUnit unit):表示在指定的时间内获取锁,如果未获取到,则返回false,否则返回true unlock():为释放锁,使其他线程有机会执行. lockInterruptibly():表示获取锁,如果线…