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

现象如下:

相关推荐
水w1 分钟前
【Python爬虫】详细入门指南
开发语言·爬虫·python·scrapy·beautifulsoup
小小深20 分钟前
了解JVM
java·jvm
Sunlight_77727 分钟前
第五章 SQLite数据库:1、SQLite 基础语法及使用案例
java·linux·服务器·jvm·数据库·tcp/ip·sqlite
JNU freshman34 分钟前
C. Robin Hood in Town思考与理解
算法
JhonKI37 分钟前
【从零实现高并发内存池】内存池整体框架设计 及 thread cache实现
java·redis·缓存
何似在人间57543 分钟前
SpringAI+DeepSeek大模型应用开发——4 对话机器人
java·机器人·大模型应用开发·spring ai
Susea&44 分钟前
数据结构初阶:双向链表
c语言·开发语言·数据结构
_x_w1 小时前
【17】数据结构之图及图的存储篇章
数据结构·python·算法·链表·排序算法·图论
anscos1 小时前
Actran声源识别方法连载(二):薄膜模态表面振动识别
人工智能·算法·仿真软件·actran
pianmian11 小时前
arcgis几何与游标(1)
开发语言·python