【Java并发编程九】同步控制

ReentrantLock(重入锁)

ReentrantLock的基本使用

 ReentrantLock可以自己决定加锁的位置和解锁的位置。

package myTest;import java.util.ArrayList;
import java.util.concurrent.locks.ReentrantLock;public class myTest implements Runnable{// 重入锁public static ReentrantLock lock = new ReentrantLock();public static int i;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new myTest(), "Thread1");Thread t2 = new Thread(new myTest(), "Thread2");t1.start();t2.start();t1.join();t2.join();System.out.println(i);}@Overridepublic void run() {lock.lock();for (int j = 0; j < 10000; j++) {lock.lock();try {i ++;} finally {lock.unlock();}}lock.unlock();System.out.println(Thread.currentThread().getName());}
}
/**
Thread1
Thread2
20000
输出的结果总是上述形式。这是因为Thread1有一个锁是执行完所有循环才会释放。
*/

ReentrantLock.lockInterruptibly() 可中断锁

 如下面代码所示,如果使用ReentrantLock的lock()方法,则会造成死锁。但是使用了lockInterruptibly可中断锁之后,t2在等待2s之后请求另外一个锁没有得到之后,就会不再尝试去获取这个锁,设置中断标志,直接断开。

import java.util.ArrayList;
import java.util.concurrent.locks.ReentrantLock;
public class myTest implements Runnable{// 重入锁public static ReentrantLock lock1 = new ReentrantLock();public static ReentrantLock lock2 = new ReentrantLock();int lock;public myTest(int lock) {this.lock = lock;}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new myTest(1),"Thread1");Thread t2 = new Thread(new myTest(2),"Thread2");t1.start();t2.start();Thread.sleep(2000);t2.interrupt();}@Overridepublic void run() {try {if(lock == 1) {lock1.lockInterruptibly();                System.out.println(Thread.currentThread().getName()+"开始运行");Thread.sleep(500);lock2.lockInterruptibly();} else {lock2.lockInterruptibly();                System.out.println(Thread.currentThread().getName()+"开始运行");Thread.sleep(500);lock1.lockInterruptibly();}} catch (InterruptedException e) {                System.out.println(Thread.currentThread().getName()+"运行出错!");
//                throw new RuntimeException(e);} finally {if(lock1.isHeldByCurrentThread()) {lock1.unlock();}if (lock2.isHeldByCurrentThread()) {lock2.unlock();}            System.out.println(Thread.currentThread().getName()+"退出");}}
}

ReentrantLock.tryLock() 限时等待锁

 使用中断锁虽然可以解决死锁,但是很出现数据不一致的问题。可以使用tryLock() 去等待锁,如果时间到了还没有获得锁,便直接放弃。
 如下面代码所示,执行慢的线程,在等待5s后,会直接执行else里面的代码。

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;public class myTest implements Runnable{// 重入锁public static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new myTest(),"Thread1");Thread t2 = new Thread(new myTest(),"Thread2");t1.start();t2.start();}@Overridepublic void run() {try {if(lock.tryLock(2, TimeUnit.SECONDS)) {Thread.sleep(3000);} else {System.out.println(Thread.currentThread().getName()+"得到锁失败");}} catch (InterruptedException e) {throw new RuntimeException(e);} finally {if(lock.isHeldByCurrentThread()) {System.out.println(Thread.currentThread().getName()+"解锁");lock.unlock();}}}
}

公平锁和非公平锁

 ReentrantLock() 默认是非公平锁,默认值为false,两个线程不会公平的获得锁。
 ReentrantLock(true) 为公平锁,两个线程会公平地获取锁,如下面代码所示,两个线程会依次执行。

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class myTest implements Runnable{// 重入锁public static ReentrantLock lock = new ReentrantLock(true);public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new myTest(),"Thread1");Thread t2 = new Thread(new myTest(),"Thread2");t1.start();t2.start();}@Overridepublic void run() {while(true) {try {lock.lock();Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"获得锁");} catch (InterruptedException e) {throw new RuntimeException(e);} finally {lock.unlock();}}}
}

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

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

相关文章

CISP模拟试题(三)

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 1. 人们对信息安全的认识从信息技术安全发展到信息安全保障,主要是由于: A.为了更好地完成组…

毕业设计ASP.NET 2368酒店信息管理系统【程序源码+文档+调试运行】

一、摘要 本文旨在设计并实现一个功能全面、易于使用的酒店信息管理系统。系统将管理员、客户和前台客服三种用户的需求纳入考虑&#xff0c;并针对每种用户设计了相应的功能模块。系统功能包括用户管理、客户管理、客房管理、商品管理、客房预订管理、入住管理和系统管理。此…

【JS】Chapter13-构造函数数据常用函数

站在巨人的肩膀上 黑马程序员前端JavaScript入门到精通全套视频教程&#xff0c;javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 &#xff08;十三&#xff09;构造函数&数据常用函数 1. 深入对象 1.1 创建对象三种方式 利用对象字面量创建对象const o {…

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用

文章目录 Android跨进程通信&#xff0c;IPC&#xff0c;RPC&#xff0c;Binder系统&#xff0c;C语言应用层调用&#xff08;&#xff09;1.概念2.流程3.bctest.c3.1 注册服务&#xff0c;打开binder驱动3.2 获取服务 4.binder_call Android跨进程通信&#xff0c;IPC&#xf…

Linux 下集成开发环境 – PyCharm介绍

介绍 在这篇指南中&#xff0c;我将向你介绍一个集成开发环境 - PyCharm&#xff0c; 你可以在它上面使用 Python 编程语言开发专业应用。 Python 是一门优秀的编程语言&#xff0c;因为它真正实现了跨平台&#xff0c;用它开发的应用程序在 Windows、Linux 以及 Mac 系统上均…

Redis-核心数据结构

五种数据结构 String结构 String结构应用场景 Hash结构 Hash结构应用场景 List结构 List结构应用场景 Set结构 Set结构应用场景 ZSet有序结构 ZSet有序结构应用场景

智能井盖传感器功能有哪些?

智能井盖传感器是一种集成了多种先进技术的传感器设备&#xff0c;旨在强化城市的公共安全&#xff0c;确保城市基础设施的稳定运作。这种传感器具有多种功能&#xff0c;例如实时监测井盖状态、监测井下气体等是否超出阈值。借助智能井盖传感器&#xff0c;政府和城市管理部门…

sapjco3.dll has version “721.619“, but required is at least version “721.913“

context with path [] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.ExceptionInInitializerError: Native library sapjco3 is too old. Found library C:\Windows\System32\sapjco3.dll has version “721.619”, but required is at least …

ThinkPHP 系列漏洞

目录 2、thinkphp5 sql注入2 3、thinkphp5 sql注入3 4、 thinkphp5 SQL注入4 5、 thinkphp5 sql注入5 6、 thinkphp5 sql注入6 7、thinkphp5 文件包含漏洞 8、ThinkPHP5 RCE 1 9、ThinkPHP5 RCE 2 10、ThinkPHP5 rce3 11、ThinkPHP 5.0.X 反序列化漏洞 12、ThinkPHP…

Python---函数的嵌套(一个函数里面又调用了另外一个函数)

函数嵌套调用------就是一个函数里面又调用了另外一个函数。 基本语法&#xff1a; # 定义 函数B def funcB():print(这是funcB函数的函数体部分...)# 定义 函数A def funcA():print(- * 80) # 这一行为了更好区分print(这是funcA函数的函数体部分...)# 假设我们在调用funcA…

论文速览 Arxiv 2023 | DMV3D: 单阶段3D生成方法

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 论文速览 Arxiv 2023 | DMV3D: DENOISING MULTI-VIEW DIFFUSION USING 3D LARGE RECONSTRUCTION MODEL 使用3D大重建模型来去噪多视图扩散 论文原文:https://arxiv.org/pdf/2311.09217.pdf…

一文了解ChatGPT Plus如何完成论文写作和AI绘图

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车&#xff0c;就有可能被淘汰在这个数字化时代&#xff0c;如何能高效地处理文本、文献查阅、PPT…

AIGC ChatGPT 4 将数据接口文件使用Python进行入库Mysql

数据分析,数据处理的过程,往往将采集到的数据,或者从生产库过来的接口文件,我们都需要进行入库操作。 如下图数据: 将这样的数据接口文件,进行入库,插入到Mysql数据库中。 用Python代码来完成。 ChatGPT4来完成代码输入。 ChatGPT4完整内容如下: 这个任务可以使用`…

Motion Plan之搜素算法笔记

背景&#xff1a; 16-18年做过一阵子无人驾驶&#xff0c;那时候痴迷于移动规划&#xff1b;然而当时可学习的资料非常少&#xff0c;网上的论文也不算太多。基本就是Darpa的几十篇无人越野几次比赛的文章&#xff0c;基本没有成系统的文章和代码讲解实现。所以对移动规划的认…

聊一聊小程序单聊页面构思

主题界面构建 主题界面构建可以有很多种做法&#xff0c;一种为左右平分式UI设计&#xff0c;简单来说就是对方和我方聊天DOM各占屏幕的一半&#xff0c;完全可以使用flex的布局以及vw构建&#xff0c;一种吧聊天内容作为整体聊天界面的子节点&#xff0c;聊天container内容的高…

逻辑漏洞(越权)

逻辑漏洞&#xff08;越权&#xff09; 0x01 何为逻辑漏洞 逻辑漏洞是指&#xff0c;在编写程序的时&#xff0c;一个流程处理处理逻辑&#xff0c;不够谨慎或逻辑不完整&#xff0c;从而造成验证失效、敏感信息暴露等问题&#xff0c;这类问题很难利用工具去发现&#xff0c…

多态语法详解

多态语法详解 一&#xff1a;概念1&#xff1a;多态实现条件 二:重写&#xff1a;三&#xff1a;向上转型和向下转型1:向上转型&#xff1a;1&#xff1a;直接赋值&#xff1a;2&#xff1a;方法传参3&#xff1a;返回值 2:向下转型 一&#xff1a;概念 1&#xff1a;同一个引…

Linux从 全栈开发 centOS 7 到 运维

Linux从 全栈开发centOS 7 到 运维 一 Linux 入门概述1.1 操作系统1.2 Linux 简介1.3 Linux 系统组成1.4 Linux 发行版1.4 Linux 应用领域1.5 Linux vs Windows 二 环境搭建【狂神说Java】服务器购买及宝塔部署环境说明为什么程序员都需要一个自己的服务器服务器如何购买买完服…

高防CDN有什么作用?

分布式拒绝服务攻击&#xff08;DDoS攻击&#xff09;是一种针对目标系统的恶意网络攻击行为&#xff0c;DDoS攻击经常会导致被攻击者的业务无法正常访问&#xff0c;也就是所谓的拒绝服务。 常见的DDoS攻击包括以下几类&#xff1a; 网络层攻击&#xff1a;比较典型的攻击类…