IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JDK synchronized wait notify/notifyAll Lock Condition await signal/signalAll -> 正文阅读

[Java知识库]JDK synchronized wait notify/notifyAll Lock Condition await signal/signalAll

博文目录


synchronized 基础

synchronized详解

在 JDK1.5 之前, synchronized 是一个重量级锁, 频繁加解锁操作相对来说比较影响性能. JDK 6 官?从 JVM 层?对 synchronized 进行了?优化, 大幅提升了其运行效率. 现在的 synchronized 可以说非常高效, 在较为简单的场景完全可以替代 Lock

对象监视器 Monitor

synchronized 的使用方式

synchronized 可以修饰静态方法, 也可以修饰实例方法, 也可以修饰代码块. 不管哪种方式, 都要明确 synchronized 的作用对象

不论使用 synchronized 的哪种方式, 只要有一个线程抢到了某一个对象的锁, 则争抢该对象锁的其他线程将阻塞等待, 直到该线程释放锁, 其他线程将被唤醒开启新一轮的争抢

举例: 不同线程同时运行下面的方法时, 线程彼此间会相互竞争锁, 因为他们都是对 SynchronizedTest.class 对象加锁

  • SynchronizedTest::foo, 修饰静态方法
  • SynchronizedTest::a, 修饰静态方法中的代码块
  • object1::e, 修饰动态方法中的代码块
  • object2::e, 修饰动态方法中的代码块
package jdk.java.util.concurrent.locks;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

@Slf4j
public class SynchronizedTest {

	private static final Object lock1 = new Object();
	private static final Object lock2 = new Object();

	public static synchronized void foo() {
		// 修饰静态方法, SynchronizedTest.class
		sleep();
		log.info("SynchronizedTest.class, foo, static, method");
	}

	public synchronized void bar() {
		// 修饰动态方法, this, 就是调用 e 方法的那个实例对象
		sleep();
		log.info("this, bar, dynamic, method");
	}

	public static void a() {
		synchronized (SynchronizedTest.class) {
			// 修饰代码块, SynchronizedTest.class
			sleep();
			log.info("SynchronizedTest.class, a, static, code block");
		}
	}

	public static void b() {
		synchronized (lock1) {
			// 修饰代码块, lock1
			sleep();
			log.info("lock1, b, static, code block");
		}
	}

	public static void c() {
		synchronized (lock2) {
			// 修饰代码块, lock2
			sleep();
			log.info("lock2, c, static, code block");
		}
	}

	public void d() {
		synchronized (this) {
			// 修饰代码块, this, 就是调用 e 方法的那个实例对象
			sleep();
			log.info("this, d, dynamic, code block");
		}
	}

	public void e() {
		synchronized (SynchronizedTest.class) {
			// 修饰代码块, SynchronizedTest.class
			sleep();
			log.info("SynchronizedTest.class, e, dynamic, code block");
		}
	}

	public void f() {
		synchronized (lock1) {
			// 修饰代码块, lock1
			sleep();
			log.info("lock1, f, dynamic, code block");
		}
	}

	public void g() {
		synchronized (lock2) {
			// 修饰代码块, lock2
			sleep();
			log.info("lock2, g, dynamic, code block");
		}
	}
	
	private static void sleep() {
		try {
			TimeUnit.SECONDS.sleep(1);
		} catch (Throwable cause) {
			cause.printStackTrace();
		}
	}

	public static void main(String[] args) {

		SynchronizedTest object1 = new SynchronizedTest();
		SynchronizedTest object2 = new SynchronizedTest();

		try {

			// SynchronizedTest.class
//			new Thread(SynchronizedTest::foo, "SynchronizedTest::foo").start();
//			new Thread(SynchronizedTest::a, "SynchronizedTest::a").start();
//			new Thread(object1::e, "object1::e").start();
//			new Thread(object2::e, "object2::e").start();
			//[20220427.163648.034][INFO ][SynchronizedTest::foo] SynchronizedTest.class, foo, static, method
			//[20220427.163649.037][INFO ][object2::e           ] SynchronizedTest.class, e, dynamic, code block
			//[20220427.163650.040][INFO ][object1::e           ] SynchronizedTest.class, e, dynamic, code block
			//[20220427.163651.054][INFO ][SynchronizedTest::a  ] SynchronizedTest.class, a, static, code block

			// this (object1)
//			new Thread(object1::bar, "object1::bar").start();
//			new Thread(object1::d, "object1::d").start();
			//[20220427.163734.814][INFO ][object1::bar         ] this, bar, dynamic, method
			//[20220427.163735.826][INFO ][object1::d           ] this, d, dynamic, code block

			// this (object2)
//			new Thread(object2::bar, "object2::bar").start();
//			new Thread(object2::d, "object2::d").start();
			//[20220427.163751.118][INFO ][object2::bar         ] this, bar, dynamic, method
			//[20220427.163752.129][INFO ][object2::d           ] this, d, dynamic, code block

			// lock1
//			new Thread(SynchronizedTest::b, "SynchronizedTest::b").start();
//			new Thread(object1::f, "object1::f").start();
//			new Thread(object2::f, "object2::f").start();
			//[20220427.163811.036][INFO ][SynchronizedTest::b  ] lock1, b, static, code block
			//[20220427.163812.050][INFO ][object2::f           ] lock1, f, dynamic, code block
			//[20220427.163813.064][INFO ][object1::f           ] lock1, f, dynamic, code block

			// lock2
//			new Thread(SynchronizedTest::c, "SynchronizedTest::c").start();
//			new Thread(object1::g, "object1::g").start();
//			new Thread(object2::g, "object2::g").start();
			//[20220427.163835.506][INFO ][SynchronizedTest::c  ] lock2, c, static, code block
			//[20220427.163836.516][INFO ][object2::g           ] lock2, g, dynamic, code block
			//[20220427.163837.530][INFO ][object1::g           ] lock2, g, dynamic, code block

			// SynchronizedTest.class, object1, object2, lock1, lock2 混搭
			// SynchronizedTest.class
			new Thread(SynchronizedTest::foo, "SynchronizedTest::foo").start();
			new Thread(SynchronizedTest::a, "SynchronizedTest::a").start();
			new Thread(object1::e, "object1::e").start();
			new Thread(object2::e, "object2::e").start();
			// object1
			new Thread(object1::bar, "object1::bar").start();
			new Thread(object1::d, "object1::d").start();
			// object2
			new Thread(object2::bar, "object2::bar").start();
			new Thread(object2::d, "object2::d").start();
			// lock1
			new Thread(SynchronizedTest::b, "SynchronizedTest::b").start();
			new Thread(object1::f, "object1::f").start();
			new Thread(object2::f, "object2::f").start();
			// lock2
			new Thread(SynchronizedTest::c, "SynchronizedTest::c").start();
			new Thread(object1::g, "object1::g").start();
			new Thread(object2::g, "object2::g").start();
			//[20220427.163903.295][INFO ][SynchronizedTest::b  ] lock1, b, static, code block
			//[20220427.163903.295][INFO ][SynchronizedTest::foo] SynchronizedTest.class, foo, static, method
			//[20220427.163903.295][INFO ][SynchronizedTest::c  ] lock2, c, static, code block
			//[20220427.163903.295][INFO ][object1::bar         ] this, bar, dynamic, method
			//[20220427.163903.295][INFO ][object2::bar         ] this, bar, dynamic, method
			//[20220427.163904.305][INFO ][object2::g           ] lock2, g, dynamic, code block
			//[20220427.163904.305][INFO ][object2::f           ] lock1, f, dynamic, code block
			//[20220427.163904.305][INFO ][object2::d           ] this, d, dynamic, code block
			//[20220427.163904.305][INFO ][object1::d           ] this, d, dynamic, code block
			//[20220427.163904.305][INFO ][object2::e           ] SynchronizedTest.class, e, dynamic, code block
			//[20220427.163905.313][INFO ][object1::f           ] lock1, f, dynamic, code block
			//[20220427.163905.313][INFO ][object1::g           ] lock2, g, dynamic, code block
			//[20220427.163905.313][INFO ][object1::e           ] SynchronizedTest.class, e, dynamic, code block
			//[20220427.163906.316][INFO ][SynchronizedTest::a  ] SynchronizedTest.class, a, static, code block

			TimeUnit.SECONDS.sleep(5);
			System.out.println();

		} catch (Throwable cause) {
			cause.printStackTrace();
		}

	}

}
  • synchronized 静态方法: 本类.class
  • synchronized 静态代码块:
    • 本类.class:
    • 某 object:
  • synchronized 动态方法: this
  • synchronized 动态代码块:
    • this:
    • 某 object:
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 11:57:32  更:2022-04-29 12:01:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:05:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码