问题导入:如果一个线程调用了一个对象的同步方法,那么他还能不能在调用这个对象的另外一个同步方法呢?

这里就是synchronized锁重入问题。

一.synchronized锁重入

来看下面的代码:

.这个是三个同步方法的类

public class Synfun_UseSynfun{
//同步方法1
public synchronized void fun1(){
System.out.println("我是一号同步方法");
this.fun2();//调用二号同步方法
}
//同步方法2
public synchronized void fun2(){
System.out.println("我是二号同步方法");
this.fun3();//调用三号同步方法
}
//同步方法3
public synchronized void fun3(){
System.out.println("我是三号同步方法");
}
}

线程类,在run方法中调用一号同步方法:

public class SynThreadText extends Thread {
private Synfun_UseSynfun synfun_useSynfun;//组合上面类
public SynThreadText(Synfun_UseSynfun synfun_useSynfun){
this.synfun_useSynfun=synfun_useSynfun;//初始化上面的类
}
@Override
public void run(){
synfun_useSynfun.fun1();//调用对象类的同步方法
} public static void main(String[] args) {
Synfun_UseSynfun synfun_useSynfun =new Synfun_UseSynfun();
SynThreadText synThreadText=new SynThreadText(synfun_useSynfun);
synThreadText.start();//开启线程
}
}

结果如下:

总结:可以看出一个线程调用了一个对象的同步方法,那么他也可以调用这个对象的另外一个同步方法。

二.synchronized锁重入支持父类继承

那么既然synchronized支持对象的方法重入,那么他是否也支持子类继承父类的同步方法重入呢?

不妨这样设计代码,在父类中有一个同步方法,子类继承这个方法,并且在创建一个子类的同步方法,在这个同步方法中去调用父类的同步方法。

代码如下:

public class SubClass extends SuperClass implements Runnable {
@Override
public void run(){
this.subSynFun();
}
//子类的同步方法
public synchronized void subSynFun(){
System.out.println("子类的同步方法");
this.superSynFun();
} public static void main(String[] args) {
SubClass sub=new SubClass();
Thread t =new Thread(sub);
t.start();
} }
//父类
class SuperClass{
//父类的同步方法
public synchronized void superSynFun(){
System.out.println("父类的同步方法");
}
}

结果如下:

说明synchronized的方法是可以重入自己的父类同步化方法。

但是在这里要注意一点的:当你去重写父类中的同步方法,如果想要达到同步的效果重写方法也必须是同步化的,反面教材代码如下:

public class SubClass2  extends SuperClass2 implements Runnable{
@Override
public void run(){ }
//重写后的方法不为同步的
@Override
public void superSynfun(){
System.out.println("子类中重写了父类中的同步方法,改为非同步");
}
}
//父类
class SuperClass2{
//父类的同步方法
public synchronized void superSynfun(){
System.out.println("父类的同步方法");
}
}

重写的方法也必须是同步化的才能实现同步。

深入理解Java中的synchronized锁重入的更多相关文章

  1. Java 学习笔记之 Synchronized锁重入

    Synchronized锁重入: 当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁.这也证明在一个Synchronized方法/块的内部调用本类的其他Synchronized方法 ...

  2. synchronized锁重入

    package synLockIn_1; /* synchronized锁重入,当一个线程得到一个对象锁且还未释放锁时,再次请求此对象锁时可以再次得到该对象的锁 * 此例中线程1进入Service类的 ...

  3. 5.synchronized锁重入

    package demo1; /** * synchronized锁重入 * Created by liudan on 2017/6/5. */ public class MyThread5_sync ...

  4. 深入理解java中的synchronized关键字

    synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D ...

  5. java 多线程8 : synchronized锁机制 之 方法锁

    脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数 ...

  6. 如何理解Java中眼花缭乱的各种并发锁?

    在互联网公司面试中,很多小伙伴都被问到过关于锁的问题. 今天,我给大家一次性把Java并发锁的全家桶彻底讲明白.包括互斥锁.读写锁.重入锁.公平锁.悲观锁.自旋锁.偏向锁等等等等.视频有点长,大家一定 ...

  7. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    Java 中15种锁的介绍 Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等,在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类 ...

  8. 5000字 | 24张图带你彻底理解Java中的21种锁

    本篇主要内容如下: 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号 锁名称 应用 1 乐观锁 CAS 2 悲观锁 synch ...

  9. 巨人大哥谈Java中的Synchronized关键字用法

    巨人大哥谈Java中的Synchronized关键字用法 认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就 ...

随机推荐

  1. CSS 文件引入

    CSS 文件引入 <html> <head> <!-- link标签引用其他文件.rel="stylesheet" 引用css.href=" ...

  2. Codeforces Round #505 (Div 1 + Div 2 Combined) Solution

    从这里开始 题目列表 瞎扯 Problem A Doggo Recoloring Problem B Weakened Common Divisor Problem C Plasticine zebr ...

  3. eclipse软件仿真操作

    1.编写程序代码(以SDRAM为例) 1.1 编写head.s汇编文件 .equ SDRAM_BASE, 0x30000000 .equ MEM_CTL_BASE, 0x48000000 .text ...

  4. python中多继承C3算法研究

    在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...

  5. linux PWM蜂鸣器移植以及驱动程序分析【转】

    本文转载自:https://blog.csdn.net/lxllinux/article/details/80885331 一.关于PWM:        PWM(Pulse Width Modula ...

  6. QThread使用——关于run和movetoThread的区别

    QThread 使用探讨 2010-10-23 00:30 注意:本文停止更新,请优先考虑 Qt 线程基础(QThread.QtConcurrent等) dbzhang800 2011.06.18 Q ...

  7. _mount_vendor

    允许NPC售卖坐骑时进行预览

  8. 安装xampp出错,windows找不到-n ?

    安装xampp出错,windows找不到-n ? https://www.zhihu.com/question/47248695/answer/105042516 尝试解决步骤 1.安装Microso ...

  9. png转tif

    发国外的文章要求图片是tif,cmyk色彩空间的. 大小尺寸还有要求. 比如 网上大神多,找到了一段代码,感谢! https://www.jianshu.com/p/ec2af4311f56 http ...

  10. DOMContentLoaded方法

    document.addEventListener('DOMContentLoaded',function(){ alert("SSDD") },false);