java锁

news/2024/11/28 11:54:10/

1.悲观锁 :锁住资源其他线程不能在访问

2.乐观锁: 不锁资源,默认其他进程不会修改资源 

锁住同步资源失败 线程是否需要阻塞?

阻塞

不阻塞: 自旋锁  适应性自旋锁      减少了线程上下文的其二环   因为是不阻塞 而是一直原地等待  

多线程竞争同步资源的流程细节有没有区别

1.不锁住资源  多个线程中只有一个能修改资源,其他线程重试   

2.同意下城执行同步资源时自动获取资源    偏向锁

3.多个线程竞争同步资源时,没有获取资源的线程自旋等待锁释放   轻量级锁

4.多个线程竞争同步资源时 没有获取资源的线程线程阻塞等待唤醒  重量级锁

自旋锁和自适应自旋锁

AQS同步器   Abstrac Queue Sych

ReentranLock 

公平锁和非公平锁

排队公平 

非公平 插队 如果失败再按公平走 

非公平吞吐量要大得多

可重入锁 加多次锁

们把使用Lock接口实现线程同步的锁称之为 显示锁,使用synchronized的称为 隐式锁 或 java内置锁

LockSupport 挂起和唤醒线程

void park()   阻塞当前线程

void  unpark()  获取 许可证

被阻塞的线程可以通过  interrupt 方法来唤醒

void parkNanos 

 该方法的不同在于 ,如果
没有拿到许可证,则调用线程会被挂起 nanos 时间后修改为自动返回。
 

(1)wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,但是park不需要获取某个对象的锁就可以锁住线程。

(2)notify只能随机选择一个线程唤醒,无法唤醒指定的线程,unpark却可以唤醒一个指定的线程。

阻塞 

wait notify    让出资源锁  非公平锁  下一个获得的线程  粗颗粒
lockspoout  park  unpark  不让资源锁 即不可被重用
 

synchronized

lock unlock  直接锁


condition.await singleall    让出资源   也是使用了 

LockSupport 类  park 和  unpark 方法

锁的底层支持  AQS  抽象同步队列

AbstractQueuedSynchronizer

AQS 是一个 FIFO 的双向队列,其内部通过节点 head 和 tail 记录队首和队尾元素    队列元素的类型为 Node 其中 Node 中的 thread 变量用来存放进入 AQS队列里面的线程:

ode 节点内部的 SHARED 用来标记该线程是获取共享资源时被阻塞
挂起后放入 AQS 队列的, EXCLUSIVE 用来标记线程是获取独占资源时被挂起后放入
AQS 队列的 ; waitStatus 记录当前线程等待状态,可以为 CANCELLED (线程被取消了)、
SIGNAL ( 线程需要被唤醒)、 CONDITION (线程在条件队列里面等待〉、 PROPAGATE (释
放共享资源时需要通知其他节点〕; prev 记录当前节点的前驱节点, next 记录当前节点的
后继节点 。

在 AQS 中 维持了 一 个 单 一 的状态信息 state,可以通过 getState 、 setState 、
compareAndS etState 函数修改其值 。 对于 Reentran tLock 的 实 现来说, state 可以用 来表示
当 前线程获取锁的可重入次数 ;对于 读写锁 ReentrantReadWriteLock 来说 , state 的 高 16
位表示读状态,也就是获取该读锁的次数,低 16 位表示获取到写锁的线程的可重入次数;
对于 semaphore 来说, state 用来表示当前可用信号的 个数:对于 CountDownlatch 来说,
state 用 来表示计数器当前的值 。

assert 关键字 表示断言,
1、assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
 
2、assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。


  

ReetrantLock 是一种独占式的可重入锁  就是可以多次 加锁 释放锁  他是通过内部一个status状态量来进行处理的  悲观锁

然后他其实真正实现的是一个sycn的内部类 实现了AQS这个抽象类,那个状态量 其实也是AQS的   state   是一个用volatile 修饰的私有变量

然后实现了AQS里面的一些方法  包括加锁去锁啊 判断是否有锁  等一些方法  

还有一个比较特别的就是  他可以设置条件变量锁,就是那个condition 锁 ,然后可以通过await方法和single方法来实现线程的阻塞和唤醒

然后他有公平和非公平两种创建。

公平就是按顺序先来后到   非公平就是可以插队

通过理解实现一个线程安全list  理解  volatile和ReetrantLock  的使用

volatile的共享和RL 的原子性

并发包 源码解读

内存操作  对象内存

Unsafe unsafe = Unsafe.getUnsafe();
unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));

使用了大量CAS操作  比较并交换

1.AtomicBoolean

2.AtomicIntger

3.AtomicLong


http://www.ppmy.cn/news/360286.html

相关文章

freeswitch如何判断挂机方

概述 freeswitch作为VOIP的软交换平台&#xff0c;需要对呼叫的信息做判断和归类。 常见的呼叫信息中&#xff0c;挂机方向的信息对于话单统计有很大的用处。 但是fs的原始话单和日志中并没有挂机方向的信息。 环境 centos&#xff1a;CentOS7 freeswitch&#xff1a;v1.…

挂机宝搭建教程

nokvm主控面板推荐操作系统版本 Centos7.6.1810 &#xff08;纯净的操作系统&#xff0c;无其他软件环境&#xff09; 主控面板硬件要求配置&#xff1a; - 最低要求 推荐配置 内存 2G 2G CPU - - 带宽 不低于2M 2M 磁盘 / 分区不少于100GB 100GB 主控面板安装&#xff1…

vc编写挂机锁

凡是去过网吧的朋友&#xff0c;对挂机锁一定不陌生&#xff0c;鼠标被限定&#xff0c;键盘关键按键被屏蔽。那么这是如何实现的呢&#xff0c;我们也来写一个吧。 // lockDlg.cpp : implementation file//#include "stdafx.h"#include "lock.h"#include…

关于电脑锁机

电脑锁机的种类 电脑锁机众所周知分为三种 1. 屏幕锁 2. 用户锁 3. 硬盘锁 首先屏幕锁 原理:软件打开后置于最上层并覆盖其他软件界面&#xff0c;通常是全屏&#xff0c;这种锁机比较有威慑性因为界面可以做的比较震撼人心&#xff0c;通常会把一些可以关闭窗口的东西给禁用…

分布式锁解决方案_Redis实现的分布式锁原理

获取锁 互斥&#xff1a;确保只有一个线程获得锁 添加锁 利用setnx的互斥性 启动Redis的我们进行测试看看怎么能某个数据来获得锁 setnx命令表示上锁只要是aa被创建出来我们不删除aa或者设定时间自动删除&#xff0c;那么这把锁就不能被释放开 释放锁 手动释放锁 如果我们…

从CAP角度分析redis分布式锁和zookeeper锁区别

前言&#xff1a; 在分布式系统中&#xff0c;一致性( c )意味着每次读取都会获取最新的写入数据或异常&#xff0c;可用性( a )意味着可以对每个请求得到非异常的响应&#xff0c;而不保证获取最新的写入数据。 分区容错( p )意味着即使节点之间的网络异常&#xff0c;系统也…

C#语言实例源码系列-电脑系统挂机锁

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是…

C#挂机锁(禁用任务管理器,禁用windows键和组合键alt+f4等等)

话不多说&#xff0c;直接上菜&#xff01; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;n…