当前位置: 首页 > news >正文

LinkedList(4):多线程LinkedList 不安全情况

多线程不安全演示,线程越多,现象越明显,这边只启了四个线程。

package com.example.demo;import java.util.LinkedList;
import java.util.UUID;public class LInkedListThread {public static void main(String[] args) {final LinkedList<String> linkedList = new LinkedList();for (int i = 0; i < 4; i++) {new Thread(new Runnable() {@Overridepublic void run() {linkedList.add(UUID.randomUUID().toString().substring(0,10));System.out.println(linkedList);}}).start();}}
}

结果如下图,没有写入四个,因为在现场运行过程中多个线程可能会抢占到相同的地址。

解决方案1:

使用synchronized锁:

package com.example.demo;import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;public class LInkedListThread {public static void main(String[] args) {final LinkedList<String> linkedList = new LinkedList();Collection ts = Collections.synchronizedCollection(linkedList);for (int i = 0; i < 4; i++) {new Thread(new Runnable() {public void run() {linkedList.add(UUID.randomUUID().toString().substring(0,10));System.out.println(linkedList);}}).start();}}
}

效果如下:

解决方案2:

使用ConcurrentLinkedQueue:cas(无锁化机制)加volatile 关键字来解决

package com.example.demo;import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;public class LInkedListThread {public static void main(String[] args) {final ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(); // cas 无锁化机制  volatile 关键字来解决的for (int i = 0; i < 4; i++) {new Thread(new Runnable() {public void run() {concurrentLinkedQueue.add(UUID.randomUUID().toString().substring(0,10));System.out.println(concurrentLinkedQueue);}}).start();}}
}

现象如下:

http://www.lryc.cn/news/160833.html

相关文章:

  • 3D印刷电路板在线渲染查看工具
  • 【mysql】出现 slow sql 问题及建议
  • element树形筛选
  • 打字侠:一款专业的中文打字网站
  • C++ std::default_random_engine的使用
  • 软件设计模式(二):工厂、门面、调停者和装饰器模式
  • pdf文件签名的问题解决
  • Node.js安装使用
  • sql:SQL优化知识点记录(七)
  • 机器学习:基于梯度下降算法的线性拟合实现和原理解析
  • 关键点数据增强
  • 最小化安装移动云大云操作系统--BCLinux-for-Euler-22.10-everything-x86_64-230316版
  • 003传统图机器学习、图特征工程
  • Apache Tomcat 漏洞复现
  • Oracle-常用权限-完整版
  • jenkins 发布job切换不同的jdk版本/ maven版本
  • 如何在小程序中给会员设置备注
  • PaddleOCR学习笔记2-初步识别服务
  • 【Opencv】Pyhton 播放上一帧,下一帧,存video,逐帧分析
  • 【关于Java:认识异常】
  • 【C++ • STL • 力扣】详解string相关OJ
  • 【Tomcat服务部署及优化】
  • C++之红黑树
  • Go语言网络编程(socket编程)TCP
  • C语言——局部和全局变量
  • 【Java基础篇 | 类和对象】--- 聊聊什么是内部类
  • 合宙Air724UG LuatOS-Air LVGL API控件-页面 (Page)
  • mongodb数据库操作
  • 第 2 章 线性表 ( 双链循环线性表(链式存储结构)实现)
  • redis在日常开发工作中的常见用法