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() {
                @Override
                public 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();
        }
    }
}

现象如下:

相关推荐
Layflok7 分钟前
《黑马笔记》 --- C++ 提高编程
开发语言·c++·stl
上单带刀不带妹27 分钟前
ES6中import与export的用法详解
开发语言·javascript·es6·import·export
爱煲汤的夏二27 分钟前
扩展卡尔曼滤波器 (EKF) 与无人机三维姿态估计:从理论到实践
单片机·嵌入式硬件·算法·无人机
用户20187928316732 分钟前
Java序列化之幽灵船“Serial号”与永生契约
android·java
工程师00732 分钟前
C#接口的定义与使用
开发语言·c#·接口
sali-tec32 分钟前
C# 基于halcon的视觉工作流-章27-带色中线
开发语言·人工智能·算法·计算机视觉·c#
用户20187928316734 分钟前
“对象永生”的奇幻故事
android·java
范特西_36 分钟前
字典树/前缀树
c++·算法
周某某~37 分钟前
Rabbit MQ的消息模式-Java原生代码
java·分布式·rabbitmq
GeekPMAlex38 分钟前
Langchain/Langgraph知识点1
算法