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关键字详解(二)的更多相关文章

  1. Java多线程(三)—— synchronized关键字详解

    一.多线程的同步 1.为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源.必须对这种潜在资源冲突进行预防. 解决方法:在线程使用一个资源时为其加锁即可. 访问资 ...

  2. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Java synchronized 关键字详解

    Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 sync ...

  4. 从线程池到synchronized关键字详解

    线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...

  5. [java] java synchronized 关键字详解

    Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一 ...

  6. synchronized关键字详解(一)

    synchronized官方定义: 同步方法支持一种简单的策略防止线程干扰和内存一致性错误,如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的(这一个synchroniz ...

  7. Java 多线程(六) synchronized关键字详解

    多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...

  8. 简单的互斥同步方式——synchronized关键字详解

    目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...

  9. SQL Server 一些关键字详解(二)

    1.LEFT JOIN 容易让人误解的地方 背景:因为在网上搜了下 LEFT JOIN 和 OUTER APPLY 的区别,时发现,有的网友解释为: 1) A   left  join  B  的连接 ...

随机推荐

  1. [bzoj1072][SCOI2007]排列(状态压缩DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1072 分析:看了题解才知道,状态的设计很巧妙,用余数表示,即f[i][j]表示二进制状 ...

  2. 12、Java并发性和多线程-Java同步块

    以下内容转自http://ifeve.com/synchronized-blocks/: Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免 ...

  3. 阿里云nginx创建多站点

    最近开始用阿里云的vps,用了它的一键安装包安装了php环境,nginx的.下面记录创建多站点的心得. 首先php安装好后会自带安装一个phpwind的站点. 文件目录存放在 /alidata/www ...

  4. wikioi 1029 中序遍历总数

    题意:给出前序遍历和后序遍历,求总共同拥有多少种中序遍历的可能. 思路: 对于一个节点.当且仅当它仅有一棵子树时,在保证先序和后序同样的前提下,才可能有不同的中序(它的子树可在左或右,所以有2种): ...

  5. unity3d-配置Android环境,打包发布Apk流程详解

    31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android ...

  6. Weka算法Classifier-meta-AdaBoostM1源代码分析(一)

    多分类器组合算法简单的来讲经常使用的有voting,bagging和boosting,当中就效果来说Boosting略占优势,而AdaBoostM1算法又相当于Boosting算法的"经典款 ...

  7. struts2 一个CRUD的BaseAction

    在struts2 in action中所见,这样封装后省去了大部分crud反复代码.尽管还不能理悟.先记下来. abstract class BaseAction extends ActionSupp ...

  8. Robot Framework 搭建和RIDE(GUI) 的环境

    在windows x64的环境上进行安装,集成Selenium2和AutoIt的libraries,以下安装步骤在win 7,win 8.1,win 10, win 2012 R2上测试通过 1. 下 ...

  9. oc79--数组的内存管理

    // // main.m // 集合(数组)对象的内存管理(MRC中) // #import <Foundation/Foundation.h> #import "Person. ...

  10. Consider using EXISTS instead of IN

    redgate给出的提示 https://documentation.red-gate.com/codeanalysis/performance-rules/pe019 In theory, EXIS ...