【Java并发编程十一】同步控制三

LockSupport 线程阻塞工具

 LockSupport的unpark() 方法可以先执行。

import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;
public class myTest implements Runnable{public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(new myTest());thread.start();Thread.sleep(3000);// 继续执行子线程LockSupport.unpark(thread);}@Overridepublic void run() {System.out.println(Thread.currentThread().getId()+"已被阻塞");// 线程被阻塞LockSupport.park();System.out.println("继续执行");}
}

ReadWriteLock 读写锁

 将读写操作分离,从而提高程序执行的效率。这个可以使多个线程可以同时读取数据。

ReentrantReadWriteLock.readLock() 读锁

 当这个方法开启的时候,在休眠一秒后加了锁,按道理来说,18个线程至少要等18秒才能运行完成,但是对于锁类型是读写锁的线程而言,可以被多个线程重复进入,重入锁和读写锁的区别在于,重入锁是对于本线程的行为可以被重复进入而不加锁,读写锁则是对于多个不进行修改操作的线程,都可以进入而不加锁

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class myTest{// 可重入锁private static Lock lock = new ReentrantLock();// 可重入的读写锁private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();// 读锁private static Lock read = reentrantReadWriteLock.readLock();private int value = 0;public static void main(String[] args) {final myTest test = new myTest();Runnable readrunnable = new Runnable() {@Overridepublic void run() {test.handleRead(read);}};for (int i = 0; i < 18; i++) {new Thread(readrunnable).start();}}public Object handleRead(Lock lock) {try {lock.lock();Thread.sleep(1000);System.out.println("what");return value;} catch (InterruptedException e) {throw new RuntimeException(e);}// 该块代码块无论如何都会被执行finally {lock.unlock();return value;}}
}

ReentrantReadWriteLock.writeLock() 写锁

 写锁是一个排它锁,只能被一个线程所获取,这个锁的主要方法,也来自于AQS同步器。

package myTest;import jdk.jshell.EvalException;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class myTest{// 可重入的读写锁private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();private static int value = 0;// 读操作public static void readFile(Thread thread) {Lock read = lock.readLock();read.lock();if(!lock.isWriteLocked()) {System.out.println(thread.getName()+": 当前为读锁");}try {for (int i = 0; i < 5; i++) {try {Thread.sleep(20);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(thread.getName()+"正在读取读取");}System.out.println(thread.getName()+": 读取完毕" + value);//setValue();} finally {System.out.println(thread.getName()+": 释放读锁");read.unlock();}}public static void setValue()  {value ++;}// 写操作public static void writeFile(Thread thread) {Lock write = lock.writeLock();if(lock.isWriteLocked()) {System.out.println(thread.getName()+"当前为写锁");}try {for (int i = 0; i < 5; i++) {try {Thread.sleep(20);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(thread.getName()+": 正在写");}value ++;System.out.println(thread.getName()+": 写完毕");} finally {System.out.println(thread.getName()+ ": 释放写锁");write.unlock();}}public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();service.execute(new Runnable() {@Overridepublic void run() {readFile(Thread.currentThread());}});service.execute(new Runnable() {@Overridepublic void run() {writeFile(Thread.currentThread());}});service.execute(new Runnable() {@Overridepublic void run() {readFile(Thread.currentThread());}});service.execute(new Runnable() {@Overridepublic void run() {readFile(Thread.currentThread());}});service.execute(new Runnable() {@Overridepublic void run() {writeFile(Thread.currentThread());}});service.execute(new Runnable() {@Overridepublic void run() {readFile(Thread.currentThread());}});}}

锁降级

 写锁可以降级为读锁,读锁不能降级为写锁。

import jdk.jshell.EvalException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class myTest{// 可重入的读写锁private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();static Lock readLock = lock.readLock();static Lock writeLock = lock.writeLock();public static void main(String[] args) {// 1. 获取写锁writeLock.lock();System.out.println("获取写锁");// 2. 获取读锁readLock.lock();System.out.println("获取读锁");// 3. 释放写锁writeLock.unlock();// 4. 释放读锁readLock.unlock();}
}

 如下面代码所示。但是在持有读锁时,在有读锁,就会报错。

import jdk.jshell.EvalException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class myTest{// 可重入的读写锁private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();static Lock readLock = lock.readLock();static Lock writeLock = lock.writeLock();public static void main(String[] args) {// 2. 获取读锁readLock.lock();System.out.println("获取读锁");        // 1. 获取写锁writeLock.lock();System.out.println("获取写锁");// 3. 释放写锁writeLock.unlock();// 4. 释放读锁readLock.unlock();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAW RGB YUV数据差异

目录 颜色与色彩空间 RAW图像 RGB图像 YUV图像 颜色与色彩空间 颜色 颜色是人眼感知到的现象&#xff0c;它是由光波的频率和强度所决定的&#xff0c;仅仅存在于人的眼睛和大脑中&#xff0c;因此为了方便描述颜色&#xff0c;引入了色彩空间。色彩空间 色彩空间&#xff…

C语言--数组与指针--打印字符串的n种方式

一.知识背景 一维数组名的含义 arr一般表示数组的起始地址&#xff08;除了两种例外&#xff09; 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表…

和鲸 × 暨大经管:高效 SAAS 服务持续赋能交叉学科应用型数据人才培养

随着新一轮科技革命与产业变革的加速演进&#xff0c;拥有学科背景的应用型数据科学人才逐渐成为我国政产学研各界的人力资源需求重点。为响应需求&#xff0c;国家愈发重视新生力量数据思维与意识的培养&#xff0c;各高校也纷纷探索如何以新兴信息技术赋能传统主流学科。 在…

达索系统SOLIDWORKS流体分析网格划分失败,大多是这2种原因

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件&#xff0c;该软件功能强大、操作人性化&#xff0c;快速轻松的分析产品内部或外部流体的流动情况&#xff0c;以用来改善产品性能和功能。 当流体分析运行网格划分时&#xff0c;提示失败。 这是由于凸起面与圆…

【LeetCode刷题】--43.字符串相乘

43.字符串相乘 方法一&#xff1a;做加法&#xff0c;模拟竖式乘法的方法计算乘积 class Solution {public String multiply(String num1, String num2) {if(num1.equals("0") || num2.equals("0")){return "0";}String res "0";//nu…

Hadoop -hdfs的读写请求

1、HDFS写数据&#xff08;宏观&#xff09;&#xff1a; 1、首先&#xff0c;客户端发送一个写数据的请求&#xff0c;通过rpc与NN建立连接&#xff0c;NN会做一些简单的校验&#xff0c;文件是否存在&#xff0c;是否有空间存储数据等。 2、NN就会将校验的结果发送给客户端…

3、基础入门——抓包封包协议APP小程序PC应用web应用

知识点 APP&小程序&PC抓包HTTP/S数据——Charles、Fiddler、Burpsuit;程序进程&网络接口&其他协议抓包——Wireshark、科来网络分析系统、TCPDump(linux)&#xff1b;通讯类应用封包分析发送接收——WPE四件套封包、科来网络分析系统。模拟器&#xff1a;逍遥…

解决requests库进行爬虫ip请求时遇到的错误的方法

目录 一、超时错误 二、连接错误 三、拒绝服务错误 四、内容编码错误 五、HTTP错误 在利用requests库进行网络爬虫的IP请求时&#xff0c;我们可能会遇到各种错误&#xff0c;如超时、连接错误、拒绝服务等等。这些错误通常是由目标网站的限制、网络问题或我们的爬虫代码中…

前端性能优化总结

这里写目录标题 页面性能测试工具测试指标 前端页面性能常见的问题前端页面性能优化常见策略及方案dns优化------预解析域名&#xff08;异步进行&#xff09;http请求优化减少请求次数同时多开持久连接 前面面试url从输入到确认搜索发生了什么js介绍new一个对象的过程&#xf…

Linux 进程等待

在2号手册里查wait&#xff08;&#xff09;。wait()等待任意一个子进程的状态。 wait&#xff08;&#xff09;等待成功会返回该子进程的id,返回失败会返回-1&#xff1a; 小实验 子进程的退出码 子进程执行work()&#xff0c;父进程wait子进程。 子进程跑完5秒之后就e…

GCANet_Gated context aggregation network for image dehazing and deraining

2019、中科大港科、有代码 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

丢掉破解版,官方免费了!!!

哈喽&#xff01;大家好。 几天不见&#xff0c;今天给大家带来一款海外的神器&#xff0c;官方宣布完全免费&#xff0c;但仅限于个人与教育用途&#xff0c;切勿商用噢&#xff01; 不要看这个软件名字普普通通&#xff0c;实际上内蕴乾坤&#xff01; 接下来看我给大家炫一…

队列的实现和OJ练习(c语言)

目录 概念 队列的实现 利用结构体存放队列结构 为什么单链表不使用这种方法&#xff1f; 初始化队列 小提示&#xff1a; 队尾入队列 队头出队列 获取队头元素 获取队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 最终代码 循环队列 队列的OJ题 …

元素清空操作clear与选择操作check

元素清空操作clear与选择操作check clear() 作用 清空输入框的所有内容.clear() 等价于 .type("{selectall}{backspace}") 语法 .clear() .clear(options)option选项 元素选中操作check与uncheck check 语法 // 所有匹配到的选择框都会被选中一遍 .check()/…

CISP模拟考试(二)

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 1.DDoS攻击主要目的是: A.破坏完整性 B.破坏机密性 C.破坏可用性 D.破坏不可抵赖性 答案:…

三、防火墙-源NAT

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式&#xff08;Easy IP&#xff09;1.4.Smart NAT1.5.三元组 NAT1.6.多出口场景下的源NAT 总结延伸 ——————————————————————————————…

C语言prim算法求最小生成树

Prim算法是一种用于寻找无向带权图的最小生成树的算法。该算法的基本思想是从一个源点开始&#xff0c;逐步向外扩展生成树&#xff0c;每次找到与当前生成树最近的未被访问的顶点&#xff0c;并将其加入到生成树中&#xff0c;直到所有顶点都被加入到生成树中为止。 具体来说…

部署你的第一个应用

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f913;FastAPI 构建应用 #基于fastapi快速创建一个项目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…

1688 API接口测试指南

本文为您提供1688 API接口的测试指南。我们将介绍1688 API的基本概念&#xff0c;详解测试步骤&#xff0c;并为您提供一系列的最佳实践&#xff0c;以确保您在与1688平台进行API交互时能够获得最佳的效果和稳定性。 一、了解1688 API 1688 API是1688平台为开发者提供的一套用…

数学建模之拟合及其代码

发现新天地&#xff0c;欢迎访问Cr不是铬的个人网站 引言 与插值问题不同&#xff0c;在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数&#xff08;曲线&#xff09;&#xff0c;使得该曲线在某种准则下与所有的数据点最为接近&#xff0c;即曲线拟合…