JUC基础

1.JUC概念

JUC是文件Java官方文档下面的java.Util下面的工具包。作用于多线程,内容有lock锁,以及callable等内容。JDK官方文档路径。基础多线程不了解可以看多线程子线程结束,执行主线程
在这里插入图片描述

2.线程、进程

1.进程:

一个程序是线程集合;

2.线程:

程序执行流的最小单元
Java默认线程两个:main、GC
Java不能自己创建线程,调用我们本地方法库C++来执行创建线程。
在这里插入图片描述

1.线程状态
public enum State {NEW,//新建RUNNABLE,//运行BLOCKED,//阻塞WAITING,//等待TIMED_WAITING,//超时等待TERMINATED;//结束}

在这里插入图片描述

2.wait、sleep区别

· 来自不同的类
wait —> Object
sleep —> Thread
· 锁释放
wait 释放锁,释放资源,sleep睡眠,不释放资源。
· 适用范围
wait必须在同步代码块中

3.并发、并行

代码获取CPU核心线程数量

Runtime.getRuntime().availableProcessors()

1.并发:

· 多个线程操作一个资源
· 单核CPU,模拟多线程执行抢占资源片,交替执行;
在这里插入图片描述

2.并行:

· 多个线程操作多个资源
· 多核CPU,多个线程同时执行;
在这里插入图片描述

4.Synchronized锁

synchronized 关键字用于确保多个线程之间对共享资源的安全访问。它可以应用于方法或代码块

1.在方法上使用 synchronized

public synchronized void synchronizedMethod() {// 在这个方法中的代码是线程安全的
}

当一个线程调用了这个方法,其他线程必须等待该方法执行完毕后才能访问它。这确保了对该方法的同步访问,从而避免了并发访问时的数据竞争。

2.在代码块中使用 synchronized:

public void someMethod() {synchronized(this) {// 在这个代码块中的代码是线程安全的}
}

在这种情况下,synchronized 关键字锁定了括号中指定的对象(这里是 this),确保只有一个线程可以同时执行被锁定的代码块。
除了锁定对象本身,还可以使用其他对象作为锁:

public void someMethod() {synchronized(lockObject) {// 在这个代码块中的代码是线程安全的}
}

在这里,lockObject 是一个特定的对象,多个线程可以共享它,并使用它来同步对共享资源的访问。
总之,synchronized 关键字在Java中是用来实现线程安全的重要工具,它可以确保对共享资源的访问是同步的,从而避免了多线程环境下的竞态条件。

5.Lock锁

Lock是一种用于实现线程同步的机制。与传统的synchronized关键字相比,Lock提供了更灵活的、可扩展的锁定操作。Lock接口定义了一组用于获取和释放锁的方法,常用的实现类是ReentrantLock。
在这里插入图片描述

Lock lock = new ReentrantLock();
lock.lock(); // 获取锁try {//业务逻辑} finally {lock.unlock(); // 释放锁}

6.Synchronized锁与Lock锁区别

1.Synchronized 内置的]ava关键字, Lock 是一个java类
2.Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁
3.Synchronized 会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁
4.Synchronized 线程1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下去;
5.Synchronized可重入锁,不可以中断的,非公平;Lock,可重入锁,可以判断锁,非公平(可以自己设置);
6.Synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码!

7.线程通信

1.先判断线程是否需要等待;
2.编写业务;
3.通知其他线程执行;

Synchronized实现

注意: if是一次判断,所以我们需要用while
在这里插入图片描述

class Data{private int number = 0;//number +1public synchronized void increment() throws InterruptedException {//用while可以防止虚假唤醒 如果我们使用全部唤醒notifyAll 采用notify也不会造成虚假唤醒while (number != 0){//线程等待this.wait();}//业务逻辑number++;System.out.println(Thread.currentThread().getName() + "---number:" + number);//启动其他线程this.notifyAll();}//number -1public synchronized void decrement() throws InterruptedException {while (number == 0){//线程等待this.wait();}//业务逻辑number--;System.out.println(Thread.currentThread().getName() + "---number:" + number);//启动其他线程this.notifyAll();}
}
public class App {public static void main(String[] args) {//获取CPU核心//CPU密集型,I/O密集型System.out.println(Runtime.getRuntime().availableProcessors());System.out.println("Hello World!");commThread();}public static void commThread() {Data data = new Data();new Thread(() -> {try {for (int i = 0; i < 10; i++) {data.increment();}} catch (InterruptedException e) {throw new RuntimeException(e);}}, "aaa").start();new Thread(() -> {try {for (int i = 0; i < 10; i++) {data.decrement();}} catch (InterruptedException e) {throw new RuntimeException(e);}}, "bbb").start();new Thread(() -> {try {for (int i = 0; i < 10; i++) {data.increment();}} catch (InterruptedException e) {throw new RuntimeException(e);}}, "ccc").start();new Thread(() -> {try {for (int i = 0; i < 10; i++) {data.decrement();}} catch (InterruptedException e) {throw new RuntimeException(e);}}, "ddd").start();}}

Lock实现

注意: condition可以有多个监视多个线程,从而指定唤醒指定线程。

class LockData {private int number = 0;private Lock lock;private Condition condition;public LockData(){this.lock = new ReentrantLock();this.condition = lock.newCondition();}//condition.await(); 相当于this.wait();//condition.signalAll(); 相当于this.notifyAll();//number +1public void increment() throws InterruptedException {lock.lock();try {while (number != 0){//线程等待condition.await();}//业务逻辑number++;System.out.println(Thread.currentThread().getName() + "---number:" + number);//启动其他线程condition.signalAll();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}//number -1public void decrement() throws InterruptedException {lock.lock();try {while (number == 0){//线程等待condition.await();}//业务逻辑number--;System.out.println(Thread.currentThread().getName() + "---number:" + number);//启动其他线程condition.signalAll();}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}}
}
public class App {public static void main(String[] args) {//获取CPU核心//CPU密集型,I/O密集型System.out.println(Runtime.getRuntime().availableProcessors());System.out.println("Hello World!");commThread();}public static void commThread() {LockData lockData = new LockData();new Thread(() -> {for (int i = 0; i < 10; i++) {try {lockData.increment();} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "aaa").start();new Thread(() -> {for (int i = 0; i < 10; i++) {try {lockData.decrement();} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "bbb").start();new Thread(() -> {for (int i = 0; i < 10; i++) {try {lockData.increment();} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "ccc").start();new Thread(() -> {for (int i = 0; i < 10; i++) {try {lockData.decrement();} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "ddd").start();}
}

不足之处望海涵

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

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

相关文章

Python第四次作业

周六&#xff1a; 1. 找出10000以内能被5或6整除&#xff0c;但不能被两者同时整除的数&#xff08;函数&#xff09; def find_number():for number in range(0,10000):if number % 5 0 or number % 6 0:if number % 5 ! number % 6:ls.append(number)print(ls)ls [] fin…

如何快速摸清一个行业?

作为一名职场人&#xff0c;或多或少都会遇到需要了解自己不熟悉的行业&#xff0c;比如&#xff1a; 职业选择&#xff0c;跳槽换工作时&#xff1a;哪家企业所在的行业有优势&#xff0c;未来会有更多的机会&#xff1f;哪个行业给的薪资会更高&#xff1f;行业内当下及未来的…

MATLAB | 怎样绘制更有立体感的柱状图

之前写了一篇文章说明了MATLAB图例可以自己diy&#xff0c;这次又有了diy的机会&#xff0c;我开发了一个简单的小工具&#xff0c;能够实现绘制伪3d的柱状图&#xff0c;大概效果如下&#xff1a; 使用说明 由于涉及的代码比较接近MATLAB底层的图形对象&#xff0c;有点东西还…

Qt使用iostream的cout

在QT想使用iostream的cout。 参考以下博客&#xff1a; &#xff08;转载&#xff09;Qt中使用cout输出的方法 pro里加上; CONFIG console勾选 Run in Terminal clean工程&#xff0c;重新构建 上面是cout的&#xff0c;下面是我的另一个函数的qDebug输出的。

Set及其实现类与常用方法

1.Set及其常用实现类 Set接口是java.util.Collection接口的子接口.用来存储一个一个的数据.后面学习到的Map接口则用来存储key-value键值对. Set : 存储无序的,不可重复的数据|----->HashSet : 主要实现类 : 底层使用的是HashMap,即使用数组单向链表红黑树来存储。|-----&…

数据挖掘及其近年来研究热点介绍

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

如何实现异地公网环境访问本地部署的支付宝沙箱环境调试支付SDK

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

OpenHarmony实战:轻量系统STM32F407芯片移植案例

介绍基于STM32F407IGT6芯片在拓维信息Niobe407开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。 移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、littlefs、hdf等子系统及组件的适配…

数据同步工具datax配置与示例

文章目录 前言一、部署步骤1、jdk环境2、python环境步骤一&#xff1a;安装方式一&#xff1a;官网下载安装包方式二&#xff1a;brew命令安装 步骤二&#xff1a;配置环境变量步骤三&#xff1a;验证 3、maven环境&#xff08;可选&#xff09; 二、下载安装datax1、下载datax…

前端自动化测试-Jest

前端自动化测试 Jest官网&#xff1a;https://jestjs.io 安装方式 npm install --save-dev jest yarn add --dev jest cnpm add --save-dev jest 使用方法 所有以 .test.js 结尾的都是测试文件 基础用法示例 num.js&#xff1a; export function getSum (a, b) {return a b…

【三十七】【算法分析与设计】STL 练习,凌波微步,栈和排序,吐泡泡,[HNOI2003]操作系统,优先队列自定义类型

凌波微步 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1 秒&#xff0c;其他语言 2 秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言 65536K 64bit IO Format: %lld 题目描述 小 Z 的体型实在是太胖了&…

24 个Intellij IDEA好用插件

24 个Intellij IDEA好用插件 一. 安装插件 Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句&#xff0c;这也太智能了&#xff0c;还显示了每条语句使用频率。 原因是它学习了我的项目代码&#xff0c;总结出了我的代码偏好。 Key Promoter X 快捷键提示插件 …