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


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

    1. package com.example.demo;
    2. import java.util.LinkedList;
    3. import java.util.UUID;
    4. public class LInkedListThread {
    5. public static void main(String[] args) {
    6. final LinkedList linkedList = new LinkedList();
    7. for (int i = 0; i < 4; i++) {
    8. new Thread(new Runnable() {
    9. @Override
    10. public void run() {
    11. linkedList.add(UUID.randomUUID().toString().substring(0,10));
    12. System.out.println(linkedList);
    13. }
    14. }).start();
    15. }
    16. }
    17. }

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

    解决方案1:

    使用synchronized锁:

    1. package com.example.demo;
    2. import java.util.Collection;
    3. import java.util.Collections;
    4. import java.util.LinkedList;
    5. import java.util.UUID;
    6. import java.util.concurrent.ConcurrentLinkedQueue;
    7. public class LInkedListThread {
    8. public static void main(String[] args) {
    9. final LinkedList linkedList = new LinkedList();
    10. Collection ts = Collections.synchronizedCollection(linkedList);
    11. for (int i = 0; i < 4; i++) {
    12. new Thread(new Runnable() {
    13. public void run() {
    14. linkedList.add(UUID.randomUUID().toString().substring(0,10));
    15. System.out.println(linkedList);
    16. }
    17. }).start();
    18. }
    19. }
    20. }

    效果如下:

    解决方案2:

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

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

    现象如下:

  • 相关阅读:
    Unity 音频插件 - MasterAudio 实现音频管理系统
    LVGL简介(基于v8.1-8.2)
    ESDA in PySal (5):空间数据的探索性分析:空间自相关
    小样本学习(Few-shot Learning)
    Pr:更改文本和形状的外观
    Java常见工具类
    springboot vue mysql的在线竞拍拍卖系统
    MYSQL基础
    Java项目:公司企业OA管理系统(java+SSM+JSP+JavaScript+Mysql)
    探索云原生技术之容器编排引擎-kubernetes常用的可视化管理工具搭建
  • 原文地址:https://blog.csdn.net/u013938578/article/details/132677218