文档章节

ReentrantLock与synchronized

skhuhu
 skhuhu
发布于 2016/11/17 15:05
字数 1078
阅读 14
收藏 0

关于互斥锁:

所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别:

synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是隐式的, 只要线程运行的代码超出了synchronized语句块范围, 锁就会被释放. 而Lock机制必须显式的调用Lock对象的unlock()方法才能释放锁, 这为获取锁和释放锁不出现在同一个块结构中, 以及以更自由的顺序释放锁提供了可能. 

 

 

关于可重入: 

一、2.4.1 内部锁

Java 提供了原子性的内置锁机制: sychronized 块。它包含两个部分:锁对象的引用和这个锁保护的代码块:

synchronized(lock) {

// 访问或修改被锁保护的共享状态

}

内部锁扮演了互斥锁( mutual exclusion lock, 也称作 mutex )的角色,一个线程拥有锁的时候,别的线程阻塞等待。

 

2.4.2 重进入(Reentrancy )

重入性:指的是同一个线程多次试图获取它所占有的锁,请求会成功。当释放锁的时候,直到重入次数清零,锁才释放完毕。

Public class Widget {

      Public synchronized void doSomething(){

           …

      }

}

Public class LoggingWidget extends Widget {

   Public synchronized void doSomething(){

      System.out.println(toString()+”:calling doSomething”);

      Super.doSomething();

   }

}

 

二、一般来说,在多线程程序中,某个任务在持有某对象的锁后才能运行任务,其他任务只有在该任务释放同一对象锁后才能拥有对象锁,然后执行任务。于是,想到,同一个任务在持有同一个对象的锁后,在不释放锁的情况下,继续调用同一个对象的其他同步(synchronized)方法,该任务是否会再次持有该对象锁呢? 

    答案是肯定的。同一个任务在调用同一个对象上的其他synchronized方法,可以再次获得该对象锁。 

 

Java代码 

  1. synchronized  m1(){  
  2. //加入此时对锁a的计数是N  
  3.  m2();  //进入m2的方法体之后锁计数是N+1,离开m2后是N  
  4. }  
  5. synchronized m2(){}  

 同一任务和对象锁的问题:http://www.iteye.com/topic/728485

 

 

 

Java代码 

  1. /*public class ReentrantLock  
  2. extends Object implements Lock, Serializable 
  3. */  

  

一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。

 

ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。

 

此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁倾向于将访问权授予等待时间最长的线程。否则此锁将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁)相比,使用公平锁的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁和保证锁分配的均衡性时差异较小。不过要注意的是,公平锁不能保证线程调度的公平性。因此,使用公平锁的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁时。还要注意的是,未定时的 tryLock 方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁是可用的,此方法就可以获得成功。

JDK:http://www.xasxt.com/java/api/java/util/concurrent/locks/ReentrantLock.html

本文转载自:http://uule.iteye.com/blog/1488356

skhuhu

skhuhu

粉丝 7
博文 47
码字总数 951
作品 0
程序员
私信 提问
浅谈Java并发编程系列(五)—— ReentrantLock VS synchronized

ReentrantLock是Java并发包中一个非常有用的组件,一些并发集合类也是用ReentrantLock实现,包括ConcurrentHashMap。ReentrantLock具有三个特性:等待可中断、可实现公平锁、以及锁可以绑定多...

codershamo
2017/11/29
0
0
并发八: ReentrantLock实现分析

显式锁 synchronized被称为内置锁,线程只要进入临界区就会自动获取锁,执行完同步代码后会自动释放锁。 J.U.C中的ReentrantLock、ReentrantReadWriteLock需要手动的进行加锁和解锁,与synch...

wangjie2016
2018/04/14
0
0
synchronized ReentrantLock 比较分析

     在编写多线程代码的时候,对于不允许并发的代码,很多需要加锁进行处理。在进行加锁处理时候,synchronized作为java的内置锁,同时也是java关键字,最为被人熟知,即使是最初级的j...

阿姆斯特朗回旋炮
2018/07/18
0
0
ReentrantLock与Synchronized

ReentrantLock和synchronized两种锁定机制 ReentrantLock和synchronized两种锁定机制 1.应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性...

J星星点灯
2017/09/09
0
0
ReentrantLock(重入锁)功能详解和应用演示

1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而...

takumiCX
2018/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JDBC直接读取properties,连接数据库的util类

完整代码如下:拼凑的代码,源代码不知道从哪来的了。见谅! 使用的话直接在自己的service或dao注入 package com.javafast.util;import com.alibaba.druid.pool.DruidDataSource;import co...

S三少S
3分钟前
0
0
StringBuffer 学习

字符串特点:字符串是常量;它们的值在创建之后不能更改. 字符串的内容一旦发生了变化,那么马上会创建一个新 的对象。 注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新...

Hellation
8分钟前
0
0
好程序员大数据分享HDFS读写两步教程

一、HDFS读写之前提 NameNode(元数据节点):存放元数据(名称空间、副本数、权限、块列表、集群配置信息),不包含数据节点。元数据节点将文件系统元数据存储在内存中。 1.DataNode(数据节点...

好程序员IT
14分钟前
0
0
Visual Paradigm 教程[UML]:如何使用子图?

下载Visual Paradigm最新试用版 查看本教程视频文件 一个清晰易懂的模型永远不会在一个图表中包含所有内容。相反,想法被分为多个层,通常称为抽象层。以用例为例。简单的椭圆形状不能代表与...

xiaochuachua
15分钟前
0
0
goland集成golint

最近参加一个项目,发现大家都是使用golint进行go代码的检测的,因为我使用的还是goland,只能集成进去进行检测。 最好的方式就是文件被修改后进行检测,所以我打算将golint集成到filewatch中...

梦朝思夕
27分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部