synchronized锁重入
- package synLockIn_1;
- /* synchronized锁重入,当一个线程得到一个对象锁且还未释放锁时,再次请求此对象锁时可以再次得到该对象的锁
- * 此例中线程1进入Service类的service_1方式时,得到了Lock锁,在这个方法内便可以再次访问service_2方法
- * 而此时由于对象锁没被释放,线程2无法访问service_1方法*/
- class Service{
- synchronized public void service1(){
- System.out.println(Thread.currentThread().getName()+" service_1");
- try{
- Thread.sleep(1000);
- }catch(InterruptedException ie){
- ie.printStackTrace();
- }
- service2();
- }
- synchronized public void service2(){
- System.out.println(Thread.currentThread().getName()+" service_2");
- try{
- Thread.sleep(1000);
- }catch(InterruptedException ie){
- ie.printStackTrace();
- }
- service3();
- }
- synchronized public void service3(){
- System.out.println(Thread.currentThread().getName()+" service_3");
- try{
- Thread.sleep(1000);
- }catch(InterruptedException ie){
- ie.printStackTrace();
- }
- }
- }
- class MyThread extends Thread{
- Service service;
- public MyThread(Service service){
- this.service = service;
- }
- @Override
- public void run(){
- service.service1();
- }
- }
- public class Run {
- public static void main(String[] args) {
- Service service = new Service(); //两个线程共享同一个Service对象,使得两个线程访问一个对象,JVM只产生一个对象锁
- MyThread t = new MyThread(service);
- t.start();
- MyThread t1 = new MyThread(service);
- t1.start();
- }
- }
运行结果如下
从运行结果中可以看出线程Thread-1先访问了service_1同步方法,输出Thread-1 service_1后停留1秒。对象锁还没释放,且两个线程共享同一个类,所以线程Thread-0无法访问service_1方法。而Thread-1还没释放对象锁,但可以重新获得对象锁继续访问service_2同步方法。
可重入锁也支持在父子类继承的环境中。
- package synLockIn2;
- /* synchronized锁重入,当一个线程得到一个对象锁且还未释放锁时,再次请求此对象锁时可以再次得到该对象的锁 */
- class Main {
- public int i = 10;
- synchronized public void operateIMainMethod(){
- try{
- System.out.println( Thread.currentThread().getName()+" main print i="+i);
- i--;
- Thread.sleep(100);
- }catch(InterruptedException ie){
- ie.printStackTrace();
- }
- }
- }
- class Sub extends Main {
- synchronized public void operateIMainMethod(){
- System.out.println(Thread.currentThread().getName()+" 线程开始!!");
- try{
- while( i > 0 ){
- System.out.println( Thread.currentThread().getName()+" sub print i=" + i);
- i--;
- Thread.sleep(100);
- super.operateIMainMethod();
- }
- }catch(InterruptedException ie){
- ie.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()+" 线程结束!!");
- }
- }
- class MyThread extends Thread{
- Sub sub = new Sub();
- MyThread(Sub sub){
- this.sub = sub;
- }
- @Override
- public void run(){
- sub.operateIMainMethod();
- }
- }
- public class Run {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Sub sub = new Sub();
- MyThread t = new MyThread(sub);
- t.start();
- MyThread t1 = new MyThread(sub);
- t1.start();
- }
- }
运行结果如下:
从结果可以看出线程Thread-0先访问子类的同步方法operateIMainMethod,输入Thread-0 sub print i=10,然后在还未释放对象锁的情况下重新获得对象锁访问父类的同步方法operateIMainMethod,输出Thread-0 main print i=9,然后进入下一个循环。
线程Thread-0访问结束释放对象锁后,线程Thread-1开始访问。由于共享同一个对象且i在同步方法operateIMainMethod()外被定义,所以当线程Thread-1访问时i已经为零。
synchronized锁重入的更多相关文章
- 深入理解Java中的synchronized锁重入
问题导入:如果一个线程调用了一个对象的同步方法,那么他还能不能在调用这个对象的另外一个同步方法呢? 这里就是synchronized锁重入问题. 一.synchronized锁重入 来看下面的代码: ...
- 5.synchronized锁重入
package demo1; /** * synchronized锁重入 * Created by liudan on 2017/6/5. */ public class MyThread5_sync ...
- Java 学习笔记之 Synchronized锁重入
Synchronized锁重入: 当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁.这也证明在一个Synchronized方法/块的内部调用本类的其他Synchronized方法 ...
- Java并发编程原理与实战十一:锁重入&自旋锁&死锁
一.锁重入 package com.roocon.thread.t6; public class Demo { /* 当第一个线程A拿到当前实例锁后,进入a方法,那么,线程A还能拿到被当前实例所加锁的 ...
- synchronized的重入
/** * synchronized的重入 * */ public class SyncDubbo1 { public synchronized void method1(){ System.out. ...
- 浅谈Java中的锁:Synchronized、重入锁、读写锁
Java开发必须要掌握的知识点就包括如何使用锁在多线程的环境下控制对资源的访问限制 ◆ Synchronized ◆ 首先我们来看一段简单的代码: 12345678910111213141516171 ...
- java的synchronized可重入锁
在java内部,同一线程在调用自己类中其他synchronized方法/块或调用父类的synchronized方法/块都不会阻碍该线程的执行,就是说同一线程对同一个对象锁是可重入的,而且同一个线程可以 ...
- Synchronized可重入锁通俗易懂的简单分析
可重入锁概念: 当一个线程得到一个对象锁后,再次请求此对象时时可以再次得到该对象的锁的,这也证明synchronized方法/块的内部调用本类的其他synchronized方法/块时,时永远可以得到锁 ...
- Synchronized可重入锁分析
可重入锁又称递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提是锁对象必须是同一对象或者class), 不会因为之前已经获取过还没实方而发生阻塞.即同一线程可执行 ...
随机推荐
- 嵌套循环中break、continue的用法
在循环语句中经常会用到break.continue语句,基本用法如下: 一.break语句为退出当前循环,在嵌套循环中结果如下: var num=0; for(var i=0;i<5;i++){ ...
- 获取字符串中img标签的url集合(转载)
/// <summary> /// 获取字符串中img的url集合 /// </summary> /// <param name="content"& ...
- php自学提升进阶路线
为了自己对php的系统全面深入的掌握,我通过个人经验,以及搜索网上高手经验,汇总了一份php自我学习路线规划,包括实战演练.学习建议.高手进阶.常见问题和测试总结五块.算是一个系统的学习计划和目标吧. ...
- Oracle虚拟索引,大表或生产环境下预估索引效果的好东西
在数据库优化过程中,索引的重要性是不言而喻的,但是在我们进行性能调整过程中, 一个索引是否能够被使用到,在索引创建之前是存在不确定性的. 而创建索引又是一个代价很高的操作,尤其是数据量很大的情况下,在 ...
- 1、SQL可搜索可排序可分页存储过程, 2、范围内的随机时间 适用于sql 2008以上
-- ============================================= -- Author: 蜘蛛王 -- Create date: 2015-10-29 -- Descri ...
- knockout+bootstrap--一些复杂的应用合集
一.针对My97日历控件的绑定 普通绑定和特殊格式绑定(红色部分) <!-- ko foreach: items --> <td class="ruyeeTableTDLa ...
- [系统开发] 一个基于Django和PureCSS的内容管理系统
这是我刚开发的一套基于Django和PureCSS的内容管理系统,目标是优雅.简洁.实用,目前功能还在完善中. 系统参考了网上的教程,除了文章管理.搜索.RSS,还增加了类别管理.用户管理,以及评论管 ...
- PICT安装与使用
一.PICT简介 PICT工具是在微软公司推出的一款成对组合的命令行生成工具,下载地址http://download.microsoft.com/download/f/5/5/f55484df-849 ...
- HotSpot 自动内存管理笔记与实战
1.对象的创建 虚拟机遇到一条new指令时,首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,则必须先进行相应的类的 ...
- Linux文件权限概念
一.Linux文件属性 1.第一列代表这个文件的类型与权限(permission): 共有10个字符 第一个字符代表这个文件的类型,是"目录,文件或链接文件等": [d]----& ...