关于重入锁的理解

原创 2016年10月11日 17:43:46
package com.joker.test;
import java.util.concurrent.locks.ReentrantLock;
/**
 *可重入锁
 *所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的
 *synchronized 和   ReentrantLock 都是可重入锁
 *可重入锁的意义在于防止死锁
 *实现原理实现是通过为每个锁关联一个请求计数和一个占有它的线程。
 *当计数为0时,认为锁是未被占有的。线程请求一个未被占有的锁时,jvm讲记录锁的占有者,并且讲请求计数器置为1 。
 *如果同一个线程再次请求这个锁,计数将递增;
 *每次占用线程退出同步块,计数器值将递减。直到计数器为0,锁被释放。
 *
 *关于父类和子类的锁的重入:
 *子类覆写了父类的synchonized方法,然后调用父类中的方法,
 *此时如果没有重入的锁,那么这段代码将产生死锁。
 *
 *以下关于子类和父类的到底是几个对象,也就是影响到父类和子类获取的是否是同一个锁(以下解释来自博客 http://blog.csdn.net/aitangyong/article/details/22695399)
 *使用A a = new A()这种方式创建对象的时候,JVM会在后台给我们分配内存空间,然后调用构造函数执行初始化操作,
 *最后返回内存空间的引用。
 *即构造函数只是进行初始化,并不负责分配内存空间(创建对象)。
 *所以呢其实创建子类对象的时候,JVM会为子类对象分配内存空间,
 *并调用父类的构造函数。
 *我们可以这样理解:创建了一个子类对象的时候,在子类对象内存中,
 *有两份数据,一份继承自父类,一份来自子类,但是他们属于同一个对象(子类对象),
 *只不过是java语法提供了this和super关键字来让我们能够按照需要访问这2份数据而已。
 *这样就产生了子类和父类的概念,但实际上只有子类对象,没有父类对象。
 *
 */
public class LockTest1 extends FLockTest1 implements Runnable{
 ReentrantLock lock = new ReentrantLock();
 public synchronized void methodA(){
  System.out.println(Thread.currentThread().getName()+"this is Method A start" );
  //此时访问
  methodB();
  System.out.println(Thread.currentThread().getName()+"this is Method A end");
 }
 public synchronized void methodB(){
  System.out.println(Thread.currentThread().getName()+"this is Method B start");
  System.out.println(Thread.currentThread().getName()+"this is Method B end");
 }
 public synchronized void test(){
  System.out.println("this is childrenTest started");
  super.test();
  System.out.println("this is childrenTest end");
 }
 @Override
 public void run() {
  //测试本类中的同步方法
  methodA();
  //测试父类和子类的重入
  test();
  //测试ReentrantLock
  reentrantLockTest1();
  
 }
 public static void main(String[] args) {
  LockTest1 t1 = new LockTest1();
  Thread t = new Thread(t1);
  t.start();
  t1.methodB();
 }
 
 public void reentrantLockTest1(){
  lock.lock();
  System.out.println("this is reentrantLockTest1");
  reentrantLockTest2();
  lock.unlock();
 }
 public void reentrantLockTest2(){
  lock.lock();
  System.out.println("this is reentrantLockTest2");
  lock.unlock();
 }
 
}
class FLockTest1 {
 public synchronized void test(){
  System.out.println("this is Father Class test started");
  System.out.println("this is Father Class test end");
 }
}
运行结果为:
mainthis is Method B start
mainthis is Method B end
Thread-0this is Method A start
Thread-0this is Method B start
Thread-0this is Method B end
Thread-0this is Method A end
this is childrenTest started
this is Father Class test started
this is Father Class test end
this is childrenTest end
this is reentrantLockTest1
this is reentrantLockTest2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011567806/article/details/52790181

ReenTrantLock可重入锁(和synchronized的区别)总结

ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的...
  • qq838642798
  • qq838642798
  • 2017-03-23 11:31:29
  • 9545

自旋锁、阻塞锁、重入锁、偏向锁、轻量锁和重量锁

关于并发编程下的各种锁机制的简单介绍和总结
  • qq_25827845
  • qq_25827845
  • 2017-07-02 17:51:15
  • 3291

Java锁的可重入性(Reentrancy)

机制:每个锁都关联一个请求计数器和一个占有他的线程,当请求计数器为0时,这个锁可以被认为是unhled的,当一个线程请求一个unheld的锁时,JVM记录锁的拥有者,并把锁的请求计数加1,如果同一个线...
  • dayuguohou2008
  • dayuguohou2008
  • 2011-08-04 16:00:32
  • 9848

Java中的锁——重入锁ReentrantLock

ReentrantLock 是一种支持支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁,除此之外,该锁还支持获取锁的公平性和非公平性选择。 1  重入的实现 对于锁的重入,我们来想这样一...
  • u010723709
  • u010723709
  • 2015-12-20 14:48:00
  • 2901

并发(一):理解可重入锁

在JAVA中,内置锁都是可重入的,也就是说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器将会递减,当计数值等于0...
  • yiifaa
  • yiifaa
  • 2017-07-03 15:18:34
  • 576

Java并发编程之重入锁

重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题。 1、线程再次...
  • zhangduilei
  • zhangduilei
  • 2017-08-01 14:57:57
  • 399

可重入锁

原文:https://www.shiyanlou.com/questions/2460 1 . 什么是可重入锁 锁的概念就不用多解释了,当某个线程A已经持有了一个锁,当线程B尝试进入被这个...
  • JOHNKING123
  • JOHNKING123
  • 2015-11-25 22:56:27
  • 5326

可重入锁和不可重入锁

一、锁的简单应用 用lock来保证原子性(this.count++这段代码称为临界区) 什么是原子性,就是不可分,从头执行到尾,不能被其他线程同时执行。 可通过CAS来实现原子操作 CAS(Comp...
  • zhongxiangbo
  • zhongxiangbo
  • 2017-04-28 15:02:30
  • 416

线程安全函数和可重入函数

线程安全函数和可再入函数 3.1线程安全函数 (1)概念 线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。  (2) 确保...
  • Ronux
  • Ronux
  • 2013-04-16 10:16:56
  • 777

重入锁+读写锁+公平锁+非公平锁

synchronized关键字可以实现线程间的同步互斥工作。Lock对象锁是一种完成同步互斥工作的一个更优秀机制。它具有比synchronized更为强大的功能,并且有嗅探锁定、多路分支等功能。重入锁...
  • chenbinqq
  • chenbinqq
  • 2018-03-12 22:15:46
  • 30
收藏助手
不良信息举报
您举报文章:关于重入锁的理解
举报原因:
原因补充:

(最多只允许输入30个字)