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

这里就是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. Docker Overlay 工作原理

    Docker 原生Overlay 网络工作流程 如图:有两个Container 独立的容器节点.他们通过Overlay网路进行通信. 网卡设备 Container eth0:eth0它是Overlay ...

  2. Docker Weave 命令整理

    Docker Weave 命令整理 # 查看weave状态 weave status # 查看状态详情 weave status connections # 查看weave相互之间节点建立的关系 we ...

  3. koa2 中 cookie 存在的中文问题

    koa2  中的 cookie 没办法直接设置中文,会报错 ‘ argument value is invalid ’ 解决办法: 先将它转成 ‘ base64 ’ 编码来存储 new Buffer( ...

  4. vue中的.native修饰符

    如果你想在某个组件的根元素上绑定事件,直接使用 @click=''function' 是不生效的,我们可以添加.native修饰符 @click.native=''function'',请看以下dem ...

  5. 数组toString()方法,数组常用操作

    int[] arr ={1,2,3,4,5}; String arrString = Arrays.toString(arr); //输出[I@7150bd4d System.out.println( ...

  6. ubuntu解压命令(转)

    -c: 建立压缩档案 -x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的参数是 ...

  7. echarts的axisLabel的文字内容过长的解决办法

    通过查找资料学习,我总结了四种解决的办法,不一定是最好的,但是希望能够帮助到需要的童鞋,同时如果大家有什么更好的方法欢迎指导. 方法一:这种方法就是将文本内容转换为字符串数组,然后再按需求换行,需要每 ...

  8. JxBrowser之四:对Http Response Code的处理

    1.由于各种原因,客户端或者服务端都可能出现err,比如服务端无响应的504 Gateway Time-out 4×× 客户错误 5×× 服务器错误 2.使用下面代码,当发生错误时,重新加载对应的ur ...

  9. 20175317 《Java程序设计》第四周学习总结

    20175317 <Java程序设计>第四周学习总结 教材学习内容总结 第四周我学习了教材第五章的内容,了解了子类与继承的知识,学到了以下内容: 明白了什么是子类与父类.类的树形结构. 子 ...

  10. [JavaScript] 设置函数同名变量为false会导致函数无法执行

    var findEmail=false; function findEmail(){ alert("findEmail");} 这样函数不会运行. 为了保证函数可以运行,修改为: ...