JUC学习笔记(3)—Lock锁

JUC 高并发编程的入门学习 课程内容概览 什么是 JUC Lock 接口 线程间通信 集合的线程安全 多线程锁 Callable 接口 JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore 读写锁: ReentrantReadWriteLock 阻塞队列 ThreadPool 线程池 Fork/Join 框架 CompletableFuture 1 什么是 JUC 1.1 JUC 简介 在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的。JUC就是 java.u 阅读详情

一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法 加个普通方法后发现和同步锁无关换成两个对象后,不是同一把锁了,情况立刻变化。 锁定的是当前对象this,类锁,锁定的是整个class,是两个不同的对象

都换成静态同步方法后,情况又变化所有的非静态同步方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。

所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,

 

public class Lock2
{
	public static void main(String[] args) throws Exception
	{
		Phone phone = new Phone();
		Phone phone2 = new Phone();
		
		new Thread(() -> {
			try 
			{
				phone.sendSMS();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}, "A").start();
		
		Thread.sleep(100);
		
		new Thread(() -> {
			try 
			{
				//phone.sendEmail();
				//phone.openPC();
				phone2.sendEmail();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}, "B").start();		
		
	}
}


class Phone//  Phone.class
{
	public static synchronized void sendSMS() throws Exception
	{
		TimeUnit.SECONDS.sleep(4);
		System.out.println("--------------sendSMS");
	}
	
	public synchronized void sendEmail() throws Exception
	{
		System.out.println("--------------sendEmail");
	}
	
	public void openPC()
	{
		System.out.println("--------------openPC");
	}
}

 

JUC详解(各种乱七八糟的锁) JUC 进程和线程: 进程:一个进程可以包含多个线程,至少是一个线程,java默认2个线程——main、GC(垃圾回收) 线程:开了一个软件,写字的时候也会有自动保存的线程在进行,Thread、Runnable、Callable java开启不了线程,java操作的是底层的C++,java无法操作,用的是虚拟机 并发与并行: 并发:多线程操作同一个资源(假设cpu只有一核的时候,模拟多线程,快速交替处理线程) 并行:CPU多核情况下才有,多个线程同时执行 并发编程的本质:充分利用电脑的CPU 线程有几种 阅读详情

相关推荐

新手必看:如何用PhaGCN2和vConTACT2搞定宏病毒组注释(附避坑指南)

本文为宏病毒组研究新手提供了使用PhaGCN2和vConTACT2进行病毒注释的完整实战指南。内容涵盖从Conda环境配置、软件安装、参数解析到结果解读的全流程,并重点分享了整合双工具进行交叉验证的策略与常见报错解决方案,旨在帮助研究者高效、准确地完成病毒分类注释工作。

j2k3l4的博客 797

【JUC基础学习笔记】

JUC基础学习笔记一、JUC概述1. JUC是什么2. 进程与线程3. 并发与并行4. sleep() 和 wait()等方法二、Lock1. Synchronized2. Lock接口与方法3. 两者异同4. Lock接口重要实现类三、线程通信 / 线程同步1. Synchronized同步块2. Lock锁四、线程安全1. 阻塞同步2. 非阻塞同步3. 非同步五、集合的线程安全1. 并发集合 ArrayList2. Vector3. Collections4. JUC.CopyOnWriteList..

sixteen_16的博客 1万+

wireshark抓包分析TCP协议和用Fiddler抓包Https分析

wireshark抓包分析TCP协议和用Fiddler抓包Https分析 1.实验说明: 以某种游戏的客户端连接服务器、断开服务器为例,用wireshark抓包分析TCP协议的三次握手连接、四次握手断开,与计算机网络原理进行验证;用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 2.实验过程: wireshark实验: (1)实验准备:安装《洛克王国》游戏客户端, 运行洛克王国客户端,打开内存资源管理器查看PID 根据PID查看洛克王国服务端的IP地址和端口号 并打开命令行运行以下命令: n

qq_42032327的博客 1261

java--JUC快速入门(彻底搞懂JUC)

线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

qq_53808097的博客 4161

银河麒麟V10+QT6.0中文输入法环境搭建全攻略(附镜像加速技巧)

本文提供了在银河麒麟V10操作系统上为QT6.0搭建中文输入法环境的完整实战指南。文章详细介绍了从系统准备、镜像源优化、QT6安装器获取与加速安装,到编译Fcitx5输入法插件依赖库、深度配置环境变量与项目的全流程。重点分享了使用国内镜像源加速安装的技巧,解决了国产化开发中QT应用无法输入中文的常见难题,旨在帮助开发者快速构建稳定高效的开发环境。

weixin_29204749的博客 394

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 828

【JUC基础】01. 初步认识JUC

前段时间,有朋友跟我说,能否写一些关于JUC的教程文章。本来呢,JUC也有在我的专栏计划之内,只是一直都还没空轮到他,那么既然有这样的一个契机,那就把JUC计划提前吧。那么今天就重点来初步认识一下什么是JUC,以及一些基本的JUC相关基础知识。

有一只柴犬的专栏 1654

动力学约束下的运动规划算法——Hybrid A*算法(附程序实现及详细解释)

本文主要介绍动力学约束下的运动规划算法中非常经典的Hybrid A*算法,大致分为三部分,第一部分是在传统A * 算法的基础上,对Hybrid A * 算法的原理、流程进行理论介绍。第二部分是详细分析 MotionPlanning运动规划库中Hybrid A * 算法的源码,进一步深入对Hybrid A * 算法的具体细节 进行理解。 第三部分是结合前面第一部分的理论和第二部分的详细源码,对Hybrid A * 算法的流程进行综合的概括总结。

慕羽★的博客 1万+

JUC学习

1、什么是JUC面试高频问java.util工具包、包、分类业务:普通的线程代码 ThreadRunnable 没有返回值、效率相比Callable低。

lycheewsh的博客 202

NSGA-II 多目标优化 —— 理论、案例与交互式 GUI 实现

本文详细介绍了 NSGA-II 多目标优化算法的基本原理、数学模型和实现流程。从非支配排序、拥挤距离计算到遗传操作,NSGA-II 通过对种群进行分层和排序,能够有效求解多目标优化问题,获得 Pareto 前沿解集。通过机械结构优化、资源分配和控制参数调优等典型案例,我们展示了 NSGA-II 在实际工程中的广泛应用。为帮助工程师和研究者更直观地理解算法求解过程,本文提供了基于 Python 与 PyQt6 的交互式 GUI 演示系统代码示例。

闲人编程的博客 2120

盲孔、埋孔、通孔、一阶HDI、二阶HDI概念

文章目录1. 盲孔和埋孔2. 一阶、二阶HDI3. PADS软件设置盲埋孔 1. 盲孔和埋孔 HDI板是高密度互连(High Density Interconnector)的缩写,是生产印制板的一种技术,使用微盲埋孔技术的一种线路分布密度比较高的电路板,也被称为盲埋孔板,下图就是一个6层HDI板,其中C和D就是盲孔,B是埋孔,A是通孔。 盲孔(Blind Via)指连接外层到内层的金属化孔,D是V13孔,连接顶层和第3层,C是V56孔,连接第5层和底层。 埋孔(Buried Via)指连接内层到内层的金属

记得诚 3万+

JUC --- Lock锁机制

使用进行开发,可以帮助我们在多线程和并发编程中更高效地管理线程和同步操作。JUC提供了多种用于处理并发问题的工具,例如线程池、同步工具、原子类、锁等。在Java的并发编程中,合理使用这些工具可以提高应用的性能和稳定性。在Java中,Lock接口是包的一部分,提供了比关键字更灵活的锁机制。Lock提供了可重入、可中断的加锁机制,并且可以手动控制锁的获取与释放。阻塞线程指的是线程由于某种原因(如等待资源、锁或I/O操作)进入无法继续执行的状态,直到某个条件被满足或事件完成。

记得开心一点嘛的博客 1279

【QNX+Android虚拟化方案】00 - 系列文章链接汇总

【QNX+Android虚拟化方案】00 - 系列文章链接汇总

|~~~热爱生活、努力学习的小伙汁~~~| 1万+

JUC全面解析-一文带你掌握JUC

本文深入解析了Java并发工具包(JUC)的核心概念和实践应用。从线程池的创建与管理到原子操作类,再到锁机制和并发集合的使用,每个部分都通过详实的讲解帮助读者全面掌握JUC的关键知识点。我们将通过对CAS机制、AQS(抽象队列同步器)、各种同步工具(如CountDownLatch、CyclicBarrier、Semaphore)、ForkJoin框架等的讲解

weixin_67796933的博客 7838

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JUC基础(三)—— Lock锁 及 AQS

我们第一章提到了JUC的几大组成部分,其中就包含了“锁”,实际上Lock锁在业务上的使用频率恐怕是最高的,它弥补了很多synchronized关键字无法顾及的场景,灵活而强大。今天我们就来看一看这个强大的Lock以及它的核心类

战斧的博客 3460

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JUC中的LOCK锁机制

本文对比了synchronized同步锁与JUC中Lock机制的差异,重点介绍了Lock的灵活特性:支持中断响应、尝试获取锁、公平锁选择等。通过生产者-消费者模型示例,演示了Lock和Condition的使用方法,解释了while循环防止虚假唤醒的必要性。相比synchronized的自动释放,Lock需要手动unlock(),但提供了更精细的线程控制,适合复杂并发场景。

weixin_54949457的博客 1374

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JUC-locks锁

java的并发包【JUC】下面就两个子包,一个是atomic原子包,另一个就是lock锁包。这个包下就提供了三种锁:ReentrantLock【可重入锁】、ReentrantReadWriteLock【可重入读写锁】、StampedLock【更轻量级的读写锁】。这些锁的实现大部分都是基于AbstractQueuedSynchronizer【俗称的AQS,分两篇文章,防止难以消化】类实现的。

m0_50149847的博客 1514

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

JUC时java.util工具包中的三个包的简称业务:普通的线程代码中,我们常使用Runnable接口但Runnable没有返回值,且效率相比较于Callable来说相对较低,功能也没有Callable强大Lock锁与synchronized锁的区别要分清在多线程情况下,不要使用if条件语句来判断是否wait或await某一线程,要用while循环语句来判断,否则线程不安全。

Lyrical-Wander的博客 1663

JUC并发编程——Synchronized锁和 Lock 锁

文章目录JUC并发编程——LOCK 锁1、传统的 Synchronize 锁2、LOCK 锁3、 Synchronize 和 Lock 的区别4、生产者消费者问题4.1、synchronize 版本生产者消费者问题4.2、Lock 版本生产者消费者问题 JUC并发编程——LOCK 锁 JUC JUC 是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包。 并发包中包含了许多并发编程中需要用到的类。 JUC 是从JDK 1.5开始出现。 JUC 目的就是为了更好的支持高并

万里顾一程的博客 653

juc之lock锁、八锁问题、以及常用辅助类

文章中表明星号的地方说明是需要重点掌握的 一、juc基础知识 1. 什么是juc java.util.concurrent (juc是包名的简写)在并发编程中使用的工具类,是关于并发编程的API。 2. 线程和进程 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。 线程上下文切换比进程上下文切换要快得多。 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源,某进程.

myjess’s blog 1301

【JUC基础】04. Lock锁

java.util.concurrent.locks为锁定和等待条件提供一个框架的接口和类,说白了就是锁所在的包。

有一只柴犬的专栏 605

JUC学习笔记01

本人学习JUC的总结

qq_39203889的博客 1399

Java并发编程—JUC的Lock锁

一、Lock (JUC锁) JUC 锁位于java.util.concurrent.locks包下,为锁和等待条件提供一个框架,它不同于内置同步和监视器。 CountDownLatch,CyclicBarrier 和 Semaphore 不在包中属于并发编程中的工具类,但也是通过 AQS(后面会讲) 来实现的。因此,我也将它们归纳到 JUC 锁中进行介绍。 1、Lock Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。 2、R...

sanmi8276的博客 592

狂神JUC——Lock锁

package com.company; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; //Lock锁,可以自己设置公平锁还是非公平锁(默认是公平的) public class LockTest { public static void main(String[] args) { Ticket2 ticket2 = new Ticket2();

黄坤的博客 475

JUC(1)基本知识及Lock锁

什么是JUC JUC是java.util.concurrent的简写。在jdk官方手册中可以看到juc相关的jar包有三个。 用中文概括一下,JUC的意思就是java并发编程工具包! 回顾线程和进程 进程:一个运行中的程序!是操作系统进行资源分配和调度的基本单位!一个进程可以包含多个线程;java默认有两个线程:main线程;GC线程! 线程:线程是操作系统中进行运算调度的最小单位! java可以开启线程吗? 不可以;因为线程的开启是调用的本地方法start0(),其底层使用的是C++;java无法直

我不想学习但是必须学习 220

JUC-Lock锁与Synchronized

文章目录Lock锁(重点)生产者和消费者问题 Lock锁(重点) 先来回顾下传统的Synchronized实现卖票案例: public class SaleTicketDemo01 { public static void main(String[] args) { // 并发:多线程操作同一个资源类, 把资源类丢入线程 Ticket ticket = new Ticket(); new Thread(()->{for (int i = 1; i

凹凸曼的博客 320
上一篇: JUC学习笔记(2)—线程间通信
下一篇: JUC学习笔记(4)—多线程之间按顺序调用
木木那年
博客等级 码龄12年 37粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值