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

这里就是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. dubbo多网卡时,服务提供者的错误IP注册到注册中心导致消费端连接不上

    使用了虚拟机之后,启动了dubbo服务提供者应用,又连了正式环境的注册中心: 一旦dubbo获取的ip错误后, 这种情况即使提供者服务停掉,目前dubbo没有能力清除这类错误的提供者: (需要修改源码 ...

  2. topcoder srm 595 div1

    problem1 link 判断最后剩下哪些区间没有被其他区间覆盖. problem2 link 假设$b$的位置固定,那么不同的$a$会使得$[a,b]$有两种情况,第一种,$[a,b]$ is n ...

  3. 7.26-Codeforces Round #372 (Div. 2)

    C. Plus and Square Root 链接:codeforces.com/group/1EzrFFyOc0/contest/716/problem/C 题型:构造 题意:起始数 x 为 2, ...

  4. Win32汇编学习(8):菜单

    这次我们将在我们的应用程序中加入一个菜单. 理论: 菜单可以说是WINDOWS最重要的元素之一.有了它,用户可以方便地选择操作命令.用户只要细读一下所有的菜单项就可以明了应用程序所提供的大概功能,而且 ...

  5. Unity3D获取系统当前时间,并格式化显示

    Unity 获取系统当前时间,并格式化显示.通过“System.DateTime”获取系统当前的时间,然后通过格式化把获得的时间格式化显示出来,具体如下: 1.打开Unity,新建一个空工程,Unit ...

  6. 使用Flask部署机器学习模型

    Introduction A lot of Machine Learning (ML) projects, amateur and professional, start with an aplomb ...

  7. Learning-MySQL【6】:视图、触发器、存储过程、函数、流程控制

    一.视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可.使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的 SQL 语句了 ...

  8. 掌握闭包closure (含义及优缺点)

    个人认为闭包其实非常好理解,我们一起去认识什么是闭包. 在javascript脚本语言中,变量的作用域只有两种,一种是全局变量,一种是局部变量. 全局变量的函数可以在整个javascript脚本语言中 ...

  9. pt站 扫盲贴 面向小白

    1.什么是pt站? 大家应该知道种子,平时下电影的渠道除了百度云,就是种子了.这种普通的的种子称为bt. pt是私人种,和bt的区别是:不是谁想下就能下的,你得加入一个社区,入了伙,社区成员之间才能相 ...

  10. 封装海康SDK出现无法加载 DLL“..\bin\HCNetSDK.dll”: 找不到指定的模块

    今天在封装海康设备的时候出现了这么一个问题,在初始化的时候提升无法加载 DLL“..\bin\HCNetSDK.dll”: 找不到指定的模块. 在网上查找了几个方法,并不是很靠谱,于是从源头找找,是什 ...