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 的连接 ...
随机推荐
- Spring使用DriverManagerDataSource和C3P0分别配置MySql6.0.6数据源
首先,看一下项目路径 先说spring配置文件吧,这个比较重要 <?xml version="1.0" encoding="UTF-8"?> < ...
- 洛谷P1028数的计算
https://www.luogu.org/problemnew/show/P1028 只用递归会超时,需要用递归型动规,用一个数组保存已经算过的值,避免重复计算. 求数字为n的方案数的最优子结构为: ...
- IE 浏览器证书错误常见问题解答
有时,你将看到下表的错误消息,比如,此网站的安全证书已经被吊销等等,说明网站的安全证书有问题. 站点的证书允许 Internet Explorer 与站点建立安全连接. SSL证书出现错误有时是证书本 ...
- Java Web学习总结(29)——Java Web中的Filter和Interceptor比较
1. 背景 在设计web应用的时候,用户登录/注册是必不可少的功能,对用户登录信息进行验证的方法也是多种多样,大致可以认为如下模式:前端验证+后台验证.根据笔者的经验,一般会在前端进行一些例如是否输入 ...
- UVALive 6510 Stickers
Stickers Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ...
- java多线程编程核心技术(三)--线程间通信
1.等待/通知机制 1.wait()方法:使当前执行代码的线程进行等待.wait()方法是Object类的方法,该方法将当前线程放入“预执行队列”中,并在wait()所处的代码行处停止执行.只到被唤起 ...
- Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译
一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...
- tomcat上传图片失败
今天,突然遇到个奇怪的问题,tomcat上传图片时好时坏,经查线上四台服务有一台服务器硬盘满了. 解决一下硬盘空间的问题,有好使了,那么图片上传通过流写到远程对象存储服务中,并没有落盘和硬盘满有哪些关 ...
- Linux ANSI 乱码问题
原帖http://blog.chinaunix.net/u/24624/showart_184609.html Windows 到 linux 解决samba-3.x客户端中文乱码问题 dos cha ...
- javascript 变量声明 和 作用域
变量的声明 1.变量声明具有提升机制,Javascript在执行时,会把所有的声明都提升到当前作用域前面. 先看一下下面的例子: (function(){ alert(b)//b is not def ...
