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

现象如下:

相关推荐
星星法术嗲人2 分钟前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
Eric.Lee202115 分钟前
数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall
python·深度学习·算法·目标检测·计算机视觉·数据集·螃蟹检测
黑不溜秋的16 分钟前
C++ 语言特性29 - 协程介绍
开发语言·c++
一丝晨光21 分钟前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
天上掉下来个程小白23 分钟前
Stream流的中间方法
java·开发语言·windows
林辞忧24 分钟前
算法修炼之路之滑动窗口
算法
xujinwei_gingko34 分钟前
JAVA基础面试题汇总(持续更新)
java·开发语言
￴ㅤ￴￴ㅤ9527超级帅35 分钟前
LeetCode hot100---二叉树专题(C++语言)
c++·算法·leetcode
liuyang-neu36 分钟前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
penguin_bark43 分钟前
LCR 068. 搜索插入位置
算法·leetcode·职场和发展