多线程、高并发(理解一)

news2024/11/25 14:32:11

线程的简单了解

  • 进程、线程、纤程
    • 创建线程的几种方式
    • synchronized
    • volatile
    • AtomicX
    • JUC 同步锁
      • ReentrantLock
      • CountDownLatch 倒数的门栓
      • CyclicBarrier 复杂操作完成,再走后续逻辑
      • Phaser 所有线程需要在屏障上等待才能进入下一步执行
      • ReadWriteLock
      • Semaphore
      • Exchanger 线程间的通信
      • LockSupport
    • AbstractQueuedSynchronizer 队列
  • (限流 Guava RateLimiter)
  • 乐观锁与悲观锁
    • 乐观锁与悲观锁的基本概念
      • 何为乐观锁与悲观锁?
      • 乐观锁与悲观锁的实现方式

进程、线程、纤程

进程:一个应用程序
线程:进程的最小执行单元
纤程:

创建线程的几种方式

static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Hello MyThread!");
        }
    }

    static class MyRun implements Runnable {
        @Override
        public void run() {
            System.out.println("Hello MyRunable!");
        }
    }

    static class MyCall implements Callable<String> {
        @Override
        public String call() {
            System.out.println("MyCall Callable!");
            return "success";
        }
    }

    public static void main(String[] args) {
        //继承thread类
        new MyThread().start();
        //实现runnable接口
        new Thread(new MyRun()).start();
        //lambda 表达式
        new Thread(()->{
            System.out.println("Hello Lambda!");
        }).start();
        
        //callable 
        Thread t=new Thread(new FutureTask<String>(new MyCall()));
        t.start();

        //线程池启动
        ExecutorService executorService= ç.newCachedThreadPool();
        executorService.execute(()->{
            System.out.println(" my Callable");
        });
        executorService.shutdown();
    }

synchronized

分别是无锁状态、偏向锁、轻量级锁和重量级锁
java中锁的四种状态
java中锁的四种状态

volatile

AtomicX

AtomicInteger

JUC 同步锁

ReentrantLock

Lock lock = new ReentrantLock();

CountDownLatch 倒数的门栓

CyclicBarrier 复杂操作完成,再走后续逻辑

参考:https://www.jianshu.com/p/128476015902

Phaser 所有线程需要在屏障上等待才能进入下一步执行

jdk 1.7 引入 

onAdvance方法是protected方法,子类可以覆写,该方法是最后一个到达的线程执行的,如果返回true表示需要终止Phaser,否则继续下一轮的phase,因此可以借助该方法实现CyclicBarrier的回调函数功能,也可以控制Phaser的阶段数,

我们可以将Phaser的概念看成是一个个的阶段, 每个阶段都需要执行的线程任务,任务执行完毕后就进入下一阶段。这里和CyclicBarrier 和CountDownLatch的概念类似, 实际上也确实可以用Phaser代替CyclicBarrier和CountDownLatch。

Phaser也是通过计数器来控制, 在Phaser中叫parties, 我们在指定了parties之后, Phaser可以根据需要动态增加或减少parties的值。

Phaser 是一个障碍,在继续执行之前需要等待动态数量的线程。在 CountDownLatch 中,该数字不能动态配置,需要在我们创建实例时提供。
public int register() //向此移相器添加一个新的未到达方。
 
public int bulkRegister(int parties)  // 将给定数量的新未到达方添加到此移相器。
 
public int arriveAndDeregister() // 到达此移相器并从其注销,而无需等待其他人到达
 
public int arrive()  // 到达此移相器,无需等待其他人到达
 
public int arriveAndAwaitAdvance()  // 到达这个移相器并等待其他人
 
public int awaitAdvance(int phase)  // 等待此移相器的相位从给定的相位值前进,如果当前相位不等于给定的相位值或此移相器终止,则立即返回。
 
public int awaitAdvanceInterruptibly(int phase, long timeout, TimeUnit unit)  // 等待此移相器的相位从给定的相位值或给定的超时时间过去,InterruptedException如果在等待时中断则抛出,或者如果当前相位不等于给定的相位值或此移相器终止,则立即返回
 
public final int getPhase() // 返回当前阶段号
 
public int getRegisteredParties()  // 返回在此移相器上注册的参与方数量
 
public int getArrivedParties()  // 返回已到达此移相器当前阶段的已注册方的数量
 
public int getUnarrivedParties()  // 返回尚未到达此移相器当前阶段的已注册方的数量。 

ReadWriteLock

StampedLock相较于普通读写锁,增加了一种乐观读。
可重入读写锁的基本使用,该锁只能在单服务实例中使用,不适合分布式多服务实例集群; ?
ReadWriteLock维护一对关联的locks,一个用于只读操作,一个用于写操作。read lock可以由多个阅读器同时进行,只要没有作者 write lock 是独家的。

写锁不存在、多次加读锁成功
写锁存在、加读锁失败、加写锁失败
读锁不存在、单次加写锁成功、多次加写锁只有第一个写锁能成功
读锁存在、加读锁成功、加写锁失败

Semaphore

Semaphore是一种计数信号量,用于控制对共享资源的访问。它维护了一个内部计数器,表示可用的许可数量。线程可以通过获取许可来访问资源,并在使用完资源后释放许可。如果许可数量为0,则获取许可的线程将被阻塞,直到有其他线程释放许可为止。

Semaphore是Java并发编程中一个强大的工具,用于控制对共享资源的访问和实现线程之间的同步。与其他并发控制机制相比,Semaphore具有灵活性和可扩展性。选择Semaphore还是其他机制取决于具体的需求和场景。在使用Semaphore时,需要注意正确地获取和释放许可,以避免死锁和资源争用等问题。

Exchanger 线程间的通信

两个线程之间交换数据

LockSupport

AbstractQueuedSynchronizer 队列

(限流 Guava RateLimiter)

乐观锁与悲观锁

乐观锁与悲观锁的基本概念

何为乐观锁与悲观锁?

乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。

乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。
因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。

悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。
因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

乐观锁与悲观锁的实现方式

悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(如Java的synchronized关键字),也可以是对数据加锁(如MySQL中的排它锁)。

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

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

相关文章

MQTT协议在物联网环境中的应用及代码实现解析(三)

三、使用C#PC端编程读取MQTT服务器上特定的主题信息 以下是使用C#编程利用MQTT协议接收MQTT服务器“mqtt.laobai.net”上的“laobai_topic001”主题上的订阅信息&#xff0c;并动态显示在多行文本框中的程序代码示例&#xff0c;包括完整的代码注释和编程说明&#xff1a; us…

javascript中过滤二维对象数组重复的字段并只保留唯一值(array.filter与Array.from)

javascript中过滤二维对象数组重复的字段并只保留唯一值 1.Array.filter过滤array.filter()方法 2.Array.from过滤Array.from方法 1.Array.filter过滤 在JavaScript中&#xff0c;你可以使用Array.filter()和Set数据结构来过滤二维对象数组中重复的字段&#xff0c;只保留唯一…

CSS三栏布局的几种自适应的排版方式

CSS三栏布局的几种方式&#xff0c;主要有 float、position、flex实现。 对红色、蓝色 box 设置 float&#xff0c;绿色不设。 <style>* {margin: 0;padding: 0;}.left {width: 200px;height: 300px;background-color: red;float:left;}.right {width: 200px;height: 300…

计算机图形硬件(二) 5 - 4 硬拷贝设备

我们可以使用几种格式来获得图像的硬拷贝输出。为了演示或存档&#xff0c;可以将图像文件传送到生成投影胶片、35 mm幻灯片或电影胶片的设备与服务部门。也可将图形输出到打印机或绘图仪上&#xff0c;从而在纸上打印出图像。 输出设备生成图片的质量依赖于可显示的点的大小和…

浅尝python 一

浅尝python一 一、注释二、指定数值精度三、算数运算符四、字符串格式化输出五、打印六、类型转换&#xff0c;不会改变原数据七、比较运算符综合练习 一、注释 1、单行注释&#xff0c;快捷键 command/ # 此行被注释掉 2、多行注释 本行被注释 本行被注释or""&quo…

react报错信息

报错信息 render函数里dom不能直接展示obj对象 取变量记得要有{} https://segmentfault.com/q/1010000009619339 这样在写的时候就已经执行方法了&#xff0c;所以此处用箭头函数&#xff08;&#xff09;》{}才会在点击时执行或者 遍历数据使用map来遍历&#xff0c;使用forea…

matplotlib用面积填充实现lmplot

文章目录 示例参数回归图 示例 在绘图时经常遇到类似区域填充的问题&#xff0c;比如对于 y sin ⁡ x y\sin x ysinx函数&#xff0c;想填充其与X轴所围成的区间&#xff0c;那么就可以使用fill_between函数。 import numpy as np import matplotlib.pyplot as pltx np.ara…

Java开发基础系列(八):泛型及反射

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(八):泛型及反射 ⏱️ 创作时间&#xff1a; 2023年0…

ETLBox for .Net Crack

ETLBox for .Net Crack 为设计的轻量级ETL(提取转换负载)工具箱和数据集成库。NET。 ETL是现代商业智能应用程序的基础&#xff0c;是将分析与之前的所有其他组件分离的唯一方法。ETL是提取-加载、转换和转换的缩写&#xff0c;描述了一个由三个步骤组成的过程&#xff1a; 提取…

学生成绩管理系统|Python小应用练习

题目要求 实现学生成绩管理系统 输入学生成绩信息序列&#xff0c;获得成绩从高到低、从低到高、按某一门成绩的排列,相同成绩都按先录入排列在前的规则处理。 数据如下&#xff1a;(数据规则&#xff1a;学生姓名 高数成绩 英语成绩 大物成绩) SanZhang 70 80 61 SiLi 86 77 …

Java的五种数据类型解析

Java的五种数据类型解析 不知道大家对java的简单数据类型是否了解&#xff0c;下面针对Java的五种类型简单数据类型表示数字和字符&#xff0c;进行详细的讲解和分析。 一、简单数据类型初始化 在Java语言中&#xff0c;简单数据类型作为类的成员变量声明时自动初始化为默认值…

IDEA远程调试SpringBoot项目

IDEA远程调试SpringBoot项目 一、前提二、脚本三、运行远程项目四、本地配置五、使用场景六、扩展点 一、前提 保证线上的jar代码和本地代码一样 二、脚本 nohup java -Xdebug -Xnoagent -Djava.compilerNONE Xrunjdwp:transportdt_socket,servery,suspendn,address5001 -ja…

golang网络编程学习-websocket

golang网络编程学习-websocket 网络编程主要的内容是&#xff1a; 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 一、websocket编程 1.1服务端&#xff0c;代码来自网络&#xff0c;仅限于学习研究 package mainimport ("fmt""net/http""os…

智慧签 - 开源研究系列文章

这些天整理了一下以前的代码&#xff0c;将一个插件里的便签器的源码单独找出来&#xff0c;弄成了这个“智慧签”的程序。程序比较简单&#xff0c;具体请读者自己看代码。 1、 项目目录&#xff1b; 目录见下图&#xff0c;对代码进行了划分&#xff0c;比较简单。主处…

golang网络编程学习-1rpc

网络编程主要的内容是&#xff1a; 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 一、rpc RPC 框架----- 远程过程调用协议RPC&#xff08;Remote Procedure Call Protocol)-----允许像调用本地服务一样调用远程服务。 RPC是指远程过程调用&#xff0c;也就是说两台服…

visual studio配置调用c++ dll opencv为例

1&#xff0c;配置VC目录&#xff0c;包含目录和库目录。 2&#xff0c;链接器->输入->包含目录 3&#xff0c;生成目录下包含对应的dll文件 4&#xff0c;需注意对应的Debug&#xff0c;Release及X86&#xff0c;X64选项

flutter 自适应宽高气泡框,聊天气泡框

先看效果 前言&#xff1a;&#xff1a;&#xff1a;&#xff1a; 网上好多气泡框&#xff0c;都让写固定宽高&#xff0c;无法自适应文本内容。 还有的就是通过算child 然后动态计算气泡框宽高&#xff0c;脱裤子&#x1f4a8;&#xff0c;放到listview 刷新数据还会丢ui&am…

Spring Cloud Alibaba的组件(解决方案)

Spring Cloud Alibaba的组件&#xff08;解决方案&#xff09; 前言Spring CloudSpring Cloud Alibaba问题的解决方案面临的问题Spring Cloud Alibaba给出的解决方案 前言 在之前的文章里我们介绍了分布式微服务以及其需要解决的问题&#xff0c;现在我们看看在Spring Cloud A…

31. IO操作

一、概览二、磁盘操作三、字节操作 实现文件复制装饰者模式 四、字符操作 编码与解码String 的编码方式Reader 与 Writer实现逐行输出文本文件的内容 五、对象操作 序列化Serializabletransient 六、网络操作 InetAddressURLSocketsDatagram 七、NIO 流与块通道与缓冲区缓冲区状…

数据结构基本概念、线性表、顺序表

一、头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 8typedef int datatype; typedef struct {int len;datatype data[MAXSIZE]; }Seqlist;Seqlist * Request_space(voi…