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. springcloud(十一):熔断聚合监控Hystrix Turbine

    springcloud(十一):熔断聚合监控Hystrix Turbine

  2. 【codeforces 3C】Tic-tac-toe

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 写一个函数判断当前局面是否有人赢. 然后枚举上一个人的棋子下在哪个地方. 然后把他撤回 看看撤回前是不是没人赢然后没撤回之前是不是有人赢了. ...

  3. JavaEE最新技术整理--新技术

    JavaEE最新技术整理-----https://blog.csdn.net/qq_21683643/article/details/79747922

  4. Java并发编程:线程池 - 实例

    代码块: public class test { public static void main(String[] args) { test t = new test(); ThreadPoolExe ...

  5. [JavaEE] Bootstrapping a JavaEE Application

    To bootsrap the application use the following Maven archetype: mvn -DarchetypeGroupId=org.codehaus.m ...

  6. Cannot update identity column 'XXX'

    Sqlserver -- 怎样改动设置主键的id能够手动更新? #1 打开表的设计界面 #2 将主键id的is Identity的属性改成No 这样就能够通过Update语句来更新表的主键id了. 怎 ...

  7. Gradle学习之创建Task的方法

    请通过下面方式下载本系列文章的Github演示样例代码: git clone https://github.com/davenkin/gradle-learning.git     Gradle的Pr ...

  8. Java Map 怎样实现Key 的唯一性?

    大家都知道.在Map和Set不可存在反复元素? 可是对于内部的细节我们并不了解.今天我们就一块来 探讨一下! 1 对于 HashMap  HashSet 他们的底层数据结构的实现是:维护了一张  Ha ...

  9. Js跨一级域名同步cookie

    1. 纯Js同步两个域名下的cookie document.cookie = "name=" + "value;" + "expires=" ...

  10. 2015南阳CCPC L - Huatuo's Medicine 签到

    L - Huatuo's Medicine Description Huatuo was a famous doctor. He use identical bottles to carry the ...