多线程8

void 取款(){int oldBalance =balance
if(!CAS(balance,oldBalance,oldBalance-500)){}}

在这个线程中如果变成了这样

void 取款(){int oldBalance =balancevoid 取款(){int oldBalance =balance
if(!CAS(balance,oldBalance,oldBalance-500)){}有人转账发生了500->1000。}
if(!CAS(balance,oldBalance,oldBalance-500)){}}

这两个东西不相等,就会产生bug,上述的过程就属于ABA问题的典型bug场景是非常高极端的情况

如何避免ABA问题呢??

核心思路是,使用账户余额判定,本身就不太科学.账户余额本身就属于"能加也能减”,就容易出现ABA问题,

引入"版本号”,约定版本号,只能加,不能减~~每次操作一次余额,版本号都要+1通过CAS判定版本号,就可以进一步的来完成上述的操作~~

一个版本号走一步

JUC中的常见类

Callable接口

public class Test {private  static int sum=0;public static void main(String[] args) throws InterruptedException {Thread t=new Thread(new Runnable() {@Overridepublic void run() {int result=0;for (int i = 0; i <=1000 ; i++) {result+=i;}sum=result;}});t.start();t.join();System.out.println(sum);}
}

    Thread t=new Thread(callable)

Callable不能直接填写到Thread构造方法中

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Test1 {public static void main(String[] args) throws InterruptedException, ExecutionException {Callable<Integer> callable=new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int result=0;for (int i = 0; i <10000 ; i++) {result+=i;}return result;}};//这是FutureTask的包装类FutureTask<Integer>futureTask=new FutureTask<>(callable);Thread thread=new Thread(futureTask);thread.start();thread.join();System.out.println(futureTask.get());}
}

FutureTask就像中间上来赚取差价。靠他们中间。

线程创建的方式:

1)继承Thread

2)使用Runnable

3)使用lambda

4)使用线程池/ThreadFactory

5)使用Callable

ReentrantLock

import java.util.concurrent.locks.ReentrantLock;public class Test2 {public static void main(String[] args) {ReentrantLock lock = new ReentrantLock();try {lock.lock();}finally {lock.unlock();}}
}

1.ReentrantLock提供了公平锁的实现synchronized只是非公平锁。

  ReentrantLock lock = new ReentrantLock(true);

2.ReentrantLock提供tryLock操作.

给加锁提供了更多的课操作空间尝试加锁,如果锁已经被获取到了,直接返回失败,而不会继续等待。

Synchronized都是遇到锁竞争,就阻塞等待.(死等)

tryLock除了直接返回这种形态之外还有一个版本,可以指定等待超时时间

3.synchronized是搭配waitnotify等待通知机制

ReentrantLock是搭配Condition类完成等待通知Condition要比waitnotify更强一点(多个线程wait,notify是唤醒随机的一个.Condition指定线程唤醒)

信号量Semaphore

信号量就是一个计数器,描述了可用资源的个数

围绕信号量有两个基本操作

1.P操作.计数器-1.申请资源

2.V操作.计数器+1.释放资源

通过Semaphore完成

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;public class Test2 {private final static Semaphore semaphore = new Semaphore(1);public static void main(String[] args){ExecutorService pools = Executors.newCachedThreadPool();for (int i=0 ; i < 10;i++){final int index = i;Runnable run = new Runnable() {@Overridepublic void run() {try {semaphore.acquire();} catch (InterruptedException e) {e.printStackTrace();} finally {//使用完成释放锁semaphore.release();System.out.println("锁释放");}}};pools.execute(run);}pools.shutdown();}}

CountDownLatch

多线程下载.

把一个大的文件,拆分成多个部分.比如20个部分

每个线程都独立和人家服务器建立连接,分20个连接进行下载

等所有线程下载完毕之后,再结果进行合并.

CountDownLatch

import java.util.concurrent.CountDownLatch;public class Test3 {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(10);latch.countDown();latch.await();//await会阻塞等待,一直到countDown调用的次数,和构造方法指定的次数一致的时候,,await才会返回}
}

Vector自带了synchronized加锁不能保证线程一定安全

Stack继承自Vector,也自带了synchronized不加锁也不能确定线程一定不安全

Hashtable也是自带synchronized一定要具体代码具体分析~~

 Vector<String>vector=new Vector<>();void  func(){if(vector.size()>0){System.out.println(vector.get(0));}}

比如t1纟线程执行func到if之后t2线程把巴vector清空了回到t1继续执行,get(0)就出问题了,

  Collections.synchronizedList(new ArrayList)

给ArrayList这些集合类,套一层壳

壳上是给关键方法都加了synchronized就可以使ArrayList达到类似于Vector效果。

CopyOnWriteArrayList

写时拷贝

修改的同时,很多线程在读呢如果直接修改,不加任何处理意味着有的线程可能会读到200,3这种“中间情况。

写完之后,用新的数组的引用,代替旧的数组的引用(3|用赋值操作,是原子的)上述过程,没有任何加锁和阻塞等待,也能确保读线程不会读出“错误的数据旧的空间就可以释放了。

多线程使用队列

直接使用BlockingQueue即可.

HashMap是线程不安全的Hashtable是带锁的,是否就线程更安全呢??但是这个并不推荐使用

Hashtable加锁就是简单粗暴给每个方法加了synchronized.就相当于是针对this加锁.只要针对Hashtable上的元素进行操作,就都会涉及到锁冲突, 

 ConcurrentHashMap做出了优化

1.使用“锁桶”的方式,来代替“一把全局锁”,有效降低锁冲突的概率

 另一方面,看起来锁对象多了,实际上也不会产生更多的额外开销Java中每个对象都可以作为锁对象就只需要把synchronized加到链表

一个hash表,上面的hash桶的个数是非常多~~大部分的操作,都没有锁冲突了,(synchronized,如果不产生锁冲突,就是个偏向锁)

2.像hash表的size,即使你插入的元素是不同的链表上的元素,也会涉及到多线程修改同一个变量

3.针对扩容操作做了特殊优化

如果发现负载因子太大了,就需要扩容扩容是一个比较重量比较低效的操作。

化整为零.ConcurrentHashMap会在扩容的时候,搞两份空间.

一份是之前扩容之前的空间一份是扩容之后的空间接下来每次进行hash表的基本操作,都会把一部分数据从I旧空间搬运到新空间

搬的过程中:1.插入=>插入到新的上面2.删除=>新的日的都要删除3.查找=>新的日的都要查找

 java8之前,ConcurrentHashMap基于分段锁的方式实现的,

引l入若干个锁对象,每个锁对象管理若干个hash桶相比于Hashtable是进化,但是不如现在直接锁桶代码写起来更复杂

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

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

相关文章

RN向上向下滑动组件封装(带有渐变色)

这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样 代码如下 import React, {useEffect, useRef, useState} from react; impo…

爱自然生命力专项基金:“爱·启航”残障家庭教育援助项目帮扶上万残障家庭

为进一步积极践行社会责任&#xff0c;助力公益慈善事业&#xff0c;2017年2月爱自然生命力体系与中国下一代教育基金会开展相关合作&#xff0c;共同启动了中国下一代教育基金会爱自然生命力专项基金&#xff0c;并启动了基金第一个项目“爱启航残障家庭教育援助项目”&#x…

华为昇腾AI芯片加持,9.1k Star 的 Open-Sora-Plan,国产Sora要来了吗

Aitrainee | 公众号&#xff1a;AI进修生 哇&#xff0c;今天Github趋势榜第一啊&#xff0c;为了重现Sora&#xff0c;北大这个Open-Sora-Plan&#xff0c;希望通过开源社区力量的复现Sora&#xff0c;目前已支持国产AI芯片(华为昇腾&#xff09;&#xff0c;这回不用被卡脖子…

Task的Wait(...)方法重载与CancellationTokenSource任务取消; Task ContinueWith方法()

//任务的Wait方法; //模拟一个执行时间为5S的Task任务&#xff0c;因为任务是异步的&#xff0c;所以不阻塞主线程 Task t_delay Task.Delay(5000); Task.WaitAll(new Task[] { t_delay }); //任务对象的Wait()方法,等待当前任务结束后继续往下执行 Task t_delay001 Task…

亚马逊欧盟站空调CE认证 EN14511标准

空调作为一种能够带来舒适凉爽的家居设备&#xff0c;已经成为现代家庭生活中不可或缺的一部分。这导致空调这个产品成为了亚马逊的热卖产品&#xff0c;空调上架亚马逊欧盟站&#xff0c;卖家需要提交CE认证 EN14511标准资质&#xff0c;证明您的产品是符合欧盟标准的&#xf…

(学习日记)2024.04.17:UCOSIII第四十五节:中断管理

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

An Investigation of Geographic Mapping Techniques for Internet Hosts(2001年)第二部分

​下载地址:An investigation of geographic mapping techniques for internet hosts | Proceedings of the 2001 conference on Applications, technologies, architectures, and protocols for computer communications 被引次数:766 Padmanabhan V N, Subramanian L. An i…

【原创】springboot+mysql宠物管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

用html写一个雨的特效

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>雨特效</title><link rel"stylesheet" href"./style.css"> </head> <body> <div id"wrap-textu…

VLAN配置不求人:华为设备配置详解

实验拓扑 实验需求 1.全网有VLAN10&#xff0c;VLAN20&#xff0c;VLAN30 2.VLAN10/20/30,192.168.10/20/30.0 3.配置Trunk, Access,Trunk封装使用Dot1q 4.Trunk的模式使用收到形成mode on 5.所有vlan的网关在router 6.单臂路由来实现所有的通讯 7.VLAN30是所有网络设备…

AskManyAI:一个GPT、Claude、Gemini、Kimi等顶级AI的决斗场

一直以来很多人问我能不能有个稳定&#xff0c;不折腾的全球AI大模型测试网站&#xff0c;既能够保证真实靠谱&#xff0c;又能够保证稳定、快速&#xff0c;不要老动不动就挂了、出错或者漫长的响应。 直到笔者遇到了AskManyAI&#xff0c;直接就惊艳住了&#xff01; 话不多…

主播美颜SDK:实现精细化美颜功能的关键技术分析

主播美颜SDK作为实现精细化美颜功能的关键技术&#xff0c;其背后蕴含着丰富的算法和工程技术。本文将对主播美颜SDK的关键技术进行深入分析&#xff0c;探讨其实现精细化美颜功能的原理与方法。 图像识别与面部分析 通过图像识别技术&#xff0c;SDK能够准确地识别出人脸位置…

学习笔记------约束的管理

此篇记录FPGA的静态时序分析&#xff0c;在学习FPGA的过程中&#xff0c;越发觉得对于时序约束只是懂了个皮毛。现在记录一下自己的学习过程。 本文摘自《VIVADO从此开始》高亚军 为什么要进行约束&#xff1f;约束的目的是什么&#xff1f; 简单来说&#xff0c;就是需要在…

HIT The Wiorld,HIT世界官网地址+配置要求+测试时间+加速器分享

HIT The Wiorld&#xff0c;HIT世界官网地址配置要求测试时间加速器分享 NEXON新游《HIT&#xff1a;世界&#xff08;HIT&#xff1a;The World&#xff09;》将在4月17日上线&#xff0c;目前已在官网开启事前预约预创建角色。Hit :the world&#xff08;HIT:世界&#xff…

拥抱信创新篇章,行云绽放麒麟软件携手认证

近年来&#xff0c;我国积极推进信创国产化&#xff0c;各产业也纷纷加速推进软件和芯片的本土化&#xff0c;将“自主可控”列为关键战略目标。在这样的背景下&#xff0c;行云绽放与麒麟软件携手共进&#xff0c;积极拥抱信创&#xff0c;完成了重要的认证工作&#xff0c;为…

拯救鲨鱼!Helping wireshark!wireshark未响应解决方法

前言 做题的的时候 在用wireshark解密tls秘钥的时候 我的小鲨鱼突然未响应了 然后我多次尝试无果 并且殃及池鱼 我电脑上所有的流量包都打不开了&#xff1f;&#xff01;&#xff01;&#xff01; 于是乎 尝试删了重下 还是未响应 开始怀疑电脑 重启电脑两次 还是打…

React-项目构建

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-项目构建 目录 1、初始化项目 2、目录结构 组件 1、组件的创建方式 1.1、函数创建组…

文件系统错误(-805305975)

背景 自己在一次无意中进行图片打开的时候突然发现了一个bug&#xff0c;使用windows10自带的照片查看器无论是打开后缀格式为jpg的图片还是后缀为png的图片&#xff0c;电脑反应都很慢&#xff0c;开始以为是图片太大导致的&#xff0c;后来换了小图片尝试还是不行&#xff0c…

AOI外观检测机可以识别哪些塑胶件缺陷?

塑胶件是由塑料材料制成的零部件或产品。塑料是一种可塑性强、耐腐蚀、轻质且具有良好绝缘性能的材料&#xff0c;因此被广泛用于各种工业和日常用品的制造中。塑胶件可以通过注塑、挤出、吹塑等工艺生产&#xff0c;形状和尺寸可以根据设计要求灵活调整。 塑胶件在各行各业中…

UE5 编辑器启动模式下去掉左上角的Clink for Mouse Control

Edit > Editor Preferences > Game Gets Mouse Control 把这个勾去掉