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();
        }
    }
}

现象如下:

相关推荐
feiyangqingyun19 分钟前
Qt项目作品在苹果macos上编译运行效果/视频监控系统/物联网平台等
开发语言·qt·macos
gsfl1 小时前
贪心算法1
算法·贪心算法
GL-Yang1 小时前
2025年-集合类面试题
java·面试
你不是我我1 小时前
【Java 开发日记】我们来说一说 Redisson 的原理
java·开发语言
kk”1 小时前
C++ stack 和 queue
开发语言·c++
Matlab仿真实验室1 小时前
基于Matlab实现双目图计算深度图
开发语言·数码相机·matlab·双目图计算深度图
小猪咪piggy1 小时前
【算法】day8 二分查找+前缀和
算法
Word码1 小时前
[排序算法]希尔排序
c语言·数据结构·算法·排序算法
李憨憨1 小时前
Java处理大型 Excel 文件(超过 100 万行)难题
java
前端小刘哥1 小时前
解析视频直播点播平台EasyDSS在视频点播领域的技术架构与性能优势
算法