深入理解Java中的synchronized锁重入
问题导入:如果一个线程调用了一个对象的同步方法,那么他还能不能在调用这个对象的另外一个同步方法呢?
这里就是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锁重入的更多相关文章
- Java 学习笔记之 Synchronized锁重入
Synchronized锁重入: 当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁.这也证明在一个Synchronized方法/块的内部调用本类的其他Synchronized方法 ...
- synchronized锁重入
package synLockIn_1; /* synchronized锁重入,当一个线程得到一个对象锁且还未释放锁时,再次请求此对象锁时可以再次得到该对象的锁 * 此例中线程1进入Service类的 ...
- 5.synchronized锁重入
package demo1; /** * synchronized锁重入 * Created by liudan on 2017/6/5. */ public class MyThread5_sync ...
- 深入理解java中的synchronized关键字
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D ...
- java 多线程8 : synchronized锁机制 之 方法锁
脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数 ...
- 如何理解Java中眼花缭乱的各种并发锁?
在互联网公司面试中,很多小伙伴都被问到过关于锁的问题. 今天,我给大家一次性把Java并发锁的全家桶彻底讲明白.包括互斥锁.读写锁.重入锁.公平锁.悲观锁.自旋锁.偏向锁等等等等.视频有点长,大家一定 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
Java 中15种锁的介绍 Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等,在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类 ...
- 5000字 | 24张图带你彻底理解Java中的21种锁
本篇主要内容如下: 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号 锁名称 应用 1 乐观锁 CAS 2 悲观锁 synch ...
- 巨人大哥谈Java中的Synchronized关键字用法
巨人大哥谈Java中的Synchronized关键字用法 认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就 ...
随机推荐
- Bugku-CTF之你必须让他停下+头等舱
Day8 你必须让他停下 地址:http://123.206.87.240:8002/web12/ 访问之后发现:
- postgresql:terminate hung query
--Find the PID by running this sql: SELECT pid , query, * from pg_stat_activity WHERE state != 'idle ...
- 进程池 和 multiprocessing.Pool模块
进程池的概念 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁 ...
- Jenkins安装及配置
Jenkins 简介 Jenkins 是一个开源项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.它的功能包括: 1.持续的 ...
- MySQL 5.6容器使用自定义配置文件的权限问题
提出问题: 在使用Rancher2.0.2部署一个mysql deployment时,我们会发现,如果只设置/var/lib/mysql数据目录时,mysql容器(pod)能够正常启动,一旦数据目录和 ...
- 力扣(LeetCode)561. 数组拆分 I
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...
- openssh升级,打补丁
以Root用户上传升级包至/home/dou/system openssh-7.5p1.tar.gz openssl-1.0.2l.tar.gz zlib-1.2.11.tar.gz l 安装所需包 ...
- Lab 6-3
In this lab, we'll analyze the malware found in the file Lab06-03.exe. Questions and Short Answers C ...
- The `android.dexOptions.incremental` property is deprecated and it has no effect on the build process.
编译报错:The android.dexOptions.incremental property is deprecated and it has no effect on the build pro ...
- http content-type 与 java后端处理
http中的常用的content-type有: application/x-www-form-urlencoded;charset=UTF-8 传递表单类数据 application/json;ch ...