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 的连接 ...
随机推荐
- 如何使用loadrunner进行web网站性能测试
loadrunner压力测试原理 本质就是在loadrunner上模拟多个用户同时按固定行为访问web站点.其中固定行为在loadrunner中是通过录制脚本定义的,多个用户同时访问的策略是在load ...
- POJ3624 0-1背包(dp+滚动数组)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 47440 Accepted: 20178 ...
- vue 刷新当前页面的时候重新调用新的cookie
data() { return{ AdminToken: this.getCookie('token'), } }, updated() { //刷新当前页面的时候重新调用新的cookie this. ...
- java nio--采用Selector实现Socket通信
server: /** * 选择器服务端 * Created by ascend on 2017/6/9 9:30. */ public class SelectorServer { // publi ...
- 【04】AngularJS 表达式
AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. Ang ...
- noip模拟赛 算
[问题背景]zhx 帮他妹子做数学题.[问题描述]求: 如 N=3, M=3, 这个值为 1^1+1^2+1^3+2^1+2^2+2^3+3^1+3^2+3^3=56. [输入格式]仅一行, 包含两个 ...
- vue.js 利用组件之间通讯,写一个弹出框例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MYSQL中有关数据库的简单操作
#创建数据库CREATE DATABASE day01; #查询所有数据库SHOW DATABASES; #查看某个数据库定义信息SHOW CREATE DATABASE day01; #查询正在使用 ...
- MySQL常用函数(转)
一.数学函数 ABS(x):返回x的绝对值 BIN(x):返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x):返回大于x的最小整数值 EXP(x):返回值e(自然对数的底)的 ...
- Mysql net start mysql启动,提示发生系统错误 5 拒绝訪问 解决之道
当前用户的操作权限太低了,出了问题 出错问题截屏例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/4 ...
