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

现象如下:

相关推荐
程序猿20232 分钟前
MySQL的逻辑存储结构
java·数据库·mysql
enmouhuadou4 分钟前
什么是I/Q信号?
算法·信息与通信
寻星探路6 分钟前
【Python 全栈测开之路】Python 进阶:库的使用与第三方生态(标准库+Pip+实战)
java·开发语言·c++·python·ai·c#·pip
2301_800256111 小时前
第九章:空间网络模型(空间网络查询、数据模型、Connected、with Recursive、pgRouting)
网络·数据库·算法·postgresql·oracle
逑之2 小时前
C语言笔记10:sizeof和strlen,指针与数组
c语言·笔记·算法
求梦8202 小时前
【力扣hot100题】旋转图像(15)
算法·leetcode·职场和发展
海边的Kurisu3 小时前
苍穹外卖日记 | Day1 苍穹外卖概述、开发环境搭建、接口文档
java
C雨后彩虹6 小时前
任务最优调度
java·数据结构·算法·华为·面试
heartbeat..7 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
Jing_jing_X7 小时前
AI分析不同阶层思维 二:Spring 的事务在什么情况下会失效?
java·spring·架构·提升·薪资