前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具

作者头像
用户5927264
发布于 2019-09-12 03:55:30
发布于 2019-09-12 03:55:30
30300
代码可运行
举报
文章被收录于专栏:OSChinaOSChina
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.shi.lock;

/**
 * 可重入锁 (递归锁)
 * 指的是同一个线程获得锁以后,内层递归函数仍然能获得该锁的代码,
 * 再同一个线程再外层获得锁的时候,在进入内层方法会自动获取锁
 * @author shiye
 *
 *结果:
	线程A  	 sedSMS() 被调用.... 
	线程A  	 sedEmail() 被调用.... 
	线程A  	  play() 被调用.... 
	线程B  	 sedSMS() 被调用.... 
	线程B  	 sedEmail() 被调用.... 
	线程B  	  play() 被调用.... 
 */
public class TestLock1 {

	public static void main(String[] args) {
		Phone phone = new Phone();
		
		new Thread( () -> {
			phone.sedSMS();
		},"线程A ").start();
		
		
		new Thread( () -> {
			phone.sedSMS();
		},"线程B ").start();
	}

}

class Phone{
	
	public synchronized void sedSMS() {
		System.out.println(Thread.currentThread().getName() + " \t sedSMS() 被调用.... " );
		sedEmail();
	}
	
	public synchronized void sedEmail() {
		System.out.println(Thread.currentThread().getName() + " \t sedEmail() 被调用.... " );
		Phone.play();
	}
	
	public static synchronized void play() {
		System.out.println(Thread.currentThread().getName() + " \t  play() 被调用.... " );
	}
}

读写锁

自旋锁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.shi.lock;

import java.util.concurrent.atomic.AtomicReference;

/**
 * 自旋锁
 * @author shiye
 *
 *运行结果:
线程A 	 come in ...
线程B 	 come in ...
线程B 	 请求获取锁
线程B 	 请求获取锁
线程B 	 请求获取锁
线程B 	 请求获取锁
线程B 	 请求获取锁
线程B 	 请求获取锁
线程B 	 请求获取锁
线程A 	 invoked myUnlock
线程B 	 invoked myUnlock

 */
public class TestSpinLock {
	
	//原子应用
	AtomicReference<Thread> atomicReference = new AtomicReference<>();
	
	//自旋加锁
	public void myLock() {
		Thread thread = Thread.currentThread();
		System.out.println(Thread.currentThread().getName() +"\t come in ...");
		
		while(!atomicReference.compareAndSet(null, thread)) {
			//自旋 直到获取当前锁
			System.out.println(Thread.currentThread().getName() + "\t 请求获取锁" );
		}
	}
	
	//自选解锁
	public void myUnlock() {
		Thread thread = Thread.currentThread();
		atomicReference.compareAndSet(thread, null);//如果是当前线程就 解锁
		System.out.println( Thread.currentThread().getName() + "\t invoked myUnlock");
	}

	public static void main(String[] args) throws InterruptedException {
		TestSpinLock spinLock = new TestSpinLock();
		
		new Thread(()-> {
			spinLock.myLock();
			try {
				Thread.sleep(1100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			spinLock.myUnlock();
		},"线程A ").start();
		
		Thread.sleep(1000);
		
		new Thread(()-> {
			spinLock.myLock();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			spinLock.myUnlock();
		},"线程B ").start();
	}

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JUC系列(九) CAS 与锁的理解
CAS:比较当前工作内存中的值,如果这个值是期望的,那么执行操作,如果不是就一直循环
冷环渊
2022/12/03
2850
JUC系列(九) CAS 与锁的理解
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
公平锁: 是指多个线程按照申请锁的顺序来获取锁。 非公平锁: 是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象。饥饿现象就是低优先级的线程可能一直拿不到锁,而一直处于等待状态。
程序猿川子
2024/11/11
2480
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
https://blog.csdn.net/qq_29689343/article/details/105046493
訾博ZiBo
2025/01/06
720
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
聊聊Java中的那些锁
说到Java中锁的分类,有很多种。本文就来聊聊公平锁、非公平锁、可重入锁、独占锁、共享锁和自旋锁。
贪挽懒月
2019/05/14
3300
聊聊Java中的那些锁
Java面试题自旋锁
重点:尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,不会堵塞。缺点是循环会消耗CPU
乐心湖
2020/07/31
6770
死磕juc(六)CAS
CAS compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期原值及更新值。
yuanshuai
2022/09/26
2200
死磕juc(六)CAS
公平锁/非公平锁/可重入锁/自旋锁
在JAVA中我们知道有很多加锁的方式,比如常见的 通过synchronized关键字,还有Lock,还有之前说原子CAS操作时有看到过的死循环方式的自旋锁。
YanL
2020/04/29
1.3K0
公平锁/非公平锁/可重入锁/自旋锁
java锁的各类锁
获得锁的线程不会立即的阻塞,而是采用循环的方式获得锁,减少了线程上下文的切换,会循环消耗CPU资源
shigen
2023/07/31
2020
原子操作类Atomic
因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。
鱼找水需要时间
2023/02/16
2.4K0
原子操作类Atomic
CAS之比较并交换
compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期原值及更新值。 执行CAS操作的时候,将内存位置的值与预期原值比较: 如果相匹配,那么处理器会自动将该位置值更新为新值, 如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。
鱼找水需要时间
2023/02/16
3940
CAS之比较并交换
Java面试——锁
公平锁:是指多个线程按照申请锁的顺序来获取锁,有点先来后到的意思。在并发环境中,每个线程在获取锁时会先查看此锁维护的队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照 FIFO 的规则从队列中取到自己。 非公平锁:指多个线程获取锁的顺序并不是按照申请锁的顺序,上来就尝试占有锁,如果尝试失败,就再采用类似公平锁的方式获取锁。有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能会造成优先级反转或者饥饿现象。
Java架构师必看
2021/05/14
4770
Java面试——锁
JUC并发编程(二)认识volatile,单例模式,各种锁
JMM : Java内存模型,不存在的东西,概念!约定! 关于JMM的一些同步的约定: 1. 线程解锁前,必须把共享变量立刻刷回主存。 2. 线程加锁前,必须读取主存中的新值到工作内存中! 3. 加锁和解锁是同一把锁
HcodeBlogger
2020/07/14
3290
JUC并发编程(二)认识volatile,单例模式,各种锁
探索JAVA并发 - 可重入锁和不可重入锁
第二次调用lock后线程就阻塞了,线程开始等待持有锁的线程放手,然而是它是它就是它。
acupt
2019/08/26
3K0
全面了解 Java 原子变量类
保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。
静默虚空
2020/01/02
8420
我去了,一篇文章,看懂锁???
Lock和synchronized,是最常见的锁,都可以达到线程安全的目的,功能常见不同
Joseph_青椒
2023/08/28
2080
我去了,一篇文章,看懂锁???
关于自旋锁的公平和非公平模式
自旋锁是并发编程实战里面一个关于锁优化的非常重要的一个概念,通常情况下会配合CAS原语来实现轻量级的同步操作。
我是攻城师
2018/08/16
4810
关于自旋锁的公平和非公平模式
【说站】java中如何实现可重入的自旋锁
java中如何实现可重入的自旋锁 说明 1、是指试图获得锁的线程不会堵塞,而是通过循环获得锁。 2、优点:减少上下文切换的消耗。 缺点:循环消耗CPU。 实例 public class ReentrantSpinLock {         private AtomicReference<Thread> owner = new AtomicReference<>();       // 可重入次数     private int count = 0;       // 加锁     public voi
很酷的站长
2022/11/23
4550
【说站】java中如何实现可重入的自旋锁
浅谈自旋锁和 JVM 对锁的优化
阻塞和唤醒线程都是需要高昂的开销的,如果同步代码块中的内容不复杂,那么可能转换线程带来的开销比实际业务代码执行的开销还要大。
PHP开发工程师
2022/09/22
3040
【进击面试_03】Java 并发
☞ JMM 是什么   JMM(Java 内存模型:Java Memory Model,简称 JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,定义了程序中各个共享变量的访问规则,即在虚拟机中将变量存储到内存和从内存读取变量这样的底层细节。   根据 JMM 的设计,系统存在一个主内存(Main Memory),Java 中所有实例变量都储存在主存中,对于所有线程都是共享的。每个线程都有自己的工作内存(Working Memory)是私有数据区域。线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝。不同的线程间无法访问对方的工作内存,线程间的通信必须通过主内存来完成。
Demo_Null
2021/03/04
2980
【进击面试_03】Java 并发
3. Java中的锁
cheese
2024/02/27
1290
3. Java中的锁
相关推荐
JUC系列(九) CAS 与锁的理解
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文