synchronized关键字详解(二)
synchronized关键字的性质
1.可重入:同一线程的外层函数获得锁之后,内层函数可直接再次获得该锁,好处:避免死锁,提升封装性
证明可重入粒度:1、同一个方法是可重入的
2、可重入不要求是同一个方法
3、可重入不要求是同一个类
可重入原理:加锁次数计数器
- JVM负责跟踪对象被加锁的次数;
- 线程第一次给对象加锁的时候计数变为1,每当这个相同的线程在这个对象上加锁时,计数递增;
- 每当任务离开时,计数会减1,计数为0时,锁被完全释放。
2.不可中断:如果一个线程拿到一把锁,另一个线程要想获得这把锁,只能等待或者阻塞,直到别的线程释放这个锁,如果另一个线程一直不释放,那就只能一直等待下去。(相比之下,Lock类拥有中断的能力:1.lock如果等的时间太长,有权利中断当前获得锁的这个线程;2.lock等待时间太长不想等,可以自动退出)
同一个方法是可重入的:
递归调用method方法打印出a=1;就说明进入该方法两次
/**
*
* 验证synchronized的可重入性质1:
* 同一个方法是可重入的
* @author Administrator
*
*/
public class SynchronizeTest04 implements Runnable{
static SynchronizeTest04 instance1 = new SynchronizeTest04();
int a = 0;
@Override
public void run() {
//调用加synchronized关键字的普通方法
method();
}
public synchronized void method() {
System.out.println("a="+a);
if(a==0) {
a++;
method();
}
}
public static void main(String[] args) {
Thread t1 = new Thread(instance1,"线程一");
t1.start();
while(t1.isAlive()) { }
System.out.println("执行结束");
}
}
可重入不要求是同一个方法:
run方法中调用被synchronized修饰的method1方法,在method1中调用被synchronized修饰的method2方法
/**
*
* 验证synchronized的可重入性质2:
* 可重入不要求是同一个方法
* @author Administrator
*
*/
public class SynchronizeTest04 implements Runnable{
static SynchronizeTest04 instance1 = new SynchronizeTest04();
int a = 0;
@Override
public void run() {
//调用加synchronized关键字的普通方法
method1();
}
public synchronized void method1() {
System.out.println("我是方法一");
method2();
}
public synchronized void method2() {
System.out.println("我是方法二");
}
public static void main(String[] args) {
Thread t1 = new Thread(instance1,"线程一");
t1.start();
while(t1.isAlive()) { }
System.out.println("执行结束");
}
}
可重入不要求是同一个方法

可重入不要求是同一个类:
由于main方法就是一个线程,所以这里用main方法演示,父类中创建被synchronized修饰的doSomething方法,子类中重写doSomething方法,并调用父类方法
/**
*
* 验证synchronized的可重入性质3:
* 可重入不要求是同一个类
* @author Administrator
*
*/
public class SynchronizeTest05 {
public synchronized void doSomething() {
System.out.println("我是父类");
}
public static void main(String[] args) {
Test t = new Test();
t.doSomething();
}
}
class Test extends SynchronizeTest05{
//重写父类的方法,并调用父类方法
public synchronized void doSomething() {
System.out.println("我是子类");
super.doSomething();
}
}
可重入不要求是同一个类

synchronized关键字的缺点:
1、效率低:锁的释放少,试图获得锁时不能设置超时,不能中断一个正在获得锁的线程;
2、不够灵活:加锁和释放的时机单一,每个锁仅有单一的条件
3、无法知道是否成功获取到锁
在使用synchronized关键字时注意:锁对象不能为空、锁的作用域不宜过大、避免死锁。
synchronized关键字详解(二)的更多相关文章
- Java多线程(三)—— synchronized关键字详解
一.多线程的同步 1.为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源.必须对这种潜在资源冲突进行预防. 解决方法:在线程使用一个资源时为其加锁即可. 访问资 ...
- “全栈2019”Java多线程第十六章:同步synchronized关键字详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java synchronized 关键字详解
Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 sync ...
- 从线程池到synchronized关键字详解
线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...
- [java] java synchronized 关键字详解
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一 ...
- synchronized关键字详解(一)
synchronized官方定义: 同步方法支持一种简单的策略防止线程干扰和内存一致性错误,如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的(这一个synchroniz ...
- Java 多线程(六) synchronized关键字详解
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...
- 简单的互斥同步方式——synchronized关键字详解
目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...
- SQL Server 一些关键字详解(二)
1.LEFT JOIN 容易让人误解的地方 背景:因为在网上搜了下 LEFT JOIN 和 OUTER APPLY 的区别,时发现,有的网友解释为: 1) A left join B 的连接 ...
随机推荐
- idea 如何将本地代码上传到github
1. 首先切换到项目根目录下 执行 git init 2. 点击项目右键->Git->Repository->Remotes->编辑URL 到github代码地址.
- String类的转换功能
/* * String类的转换功能 * char[] toCharArray():把字符串转换为字符数组 * String toLowerCase():把字符串转换为小写字符串 * String to ...
- 【04】AngularJS 表达式
AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. Ang ...
- Win32编程API 基础篇 -- 6.菜单和图标
菜单和按钮 例子:菜单1 本小节仅仅向你展示如果向你的窗口中加入一个基本的菜单,通常你会用到一个提前制作好的菜单资源,这会是一份.rc文件并且会被编译链接进你的.exe可执行程序中.这是具体的流程做法 ...
- [bzoj 2463]谁能赢呢?(博弈论)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2463 分析:因为都是按最优策略,所以棋盘肯定都能走满,于是胜负关系就是判断n*n的奇偶 ...
- velt-0.1.7开发: KernelConfig的问题
快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载.但请保留作者信息 VELT的全称是Vi ...
- logistic regression教程1
实现线性拟合 我们用python2.7实现上一篇的推导结果.请先安装python matplotlib包和numpy包. 具体代码如下: #!/usr/bin/env python #! -*- co ...
- zoj3605 Find the Marble --- 概率dp
n个杯子.球最開始在s位置.有m次换球操作,看到了k次,看的人依据自己看到的k次猜球终于在哪个位置,输出可能性最大的位置. dp[m][k][s]表示前m次操作中看到了k次球终于在s的频率. #inc ...
- 微信JS-SDK怎样使用
前两天要用到微信JS库的的一句话--wx.closeWindow();可是整个调用过程有点儿泪奔了.. .. 尽管开发人员平台上说的清清楚楚,可是使用起来就是not ok! 一,绑定域名 登录到微信公 ...
- # [libx264 @ 00000275eb57fec0] height not divisible by 2 (520x325)
# [libx264 @ 00000275eb57fec0] height not divisible by 2 (520x325)
