本篇文章小编给大家分享一下Java JUC中操作List安全类的集合代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
不安全的集合
在单线程应用中,通常采取new ArrayList(),指定一个List集合,用于存放可重复的数据。
但在多线程下,往往会出现意想不到的问题,代码如下所示:
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { // 创建list集合 //Listlists = Arrays.asList("1", "2", "3"); // 不安全 List lists = new ArrayList<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
其运行结果如下所示:
多线程操作同一集合对象信息,往往会出现java.util.ConcurrentModificationException异常报错信息。
Java中提供的安全措施
在java语言中,提供了一种新的List集合,java.util.Vector类,具体看下列代码:
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { // 创建list集合 //Listlists = Arrays.asList("1", "2", "3"); // 不安全 //List lists = new ArrayList<>(); List lists = new Vector<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
运行日志如下所示:
不会出现java.util.ConcurrentModificationException报错信息。
为什么能保证数据的安全操作?
采取了 synchronized 针对方法执行调用者加锁,保证add操作的多线程安全性!
JUC下的安全List集合
在JUC包下,提供有以下几种创建安全集合的方式。
方式一:Collections.synchronizedList(new ArrayList<>());
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { Listlists = Collections.synchronizedList(new ArrayList<>()); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
查看底层源码实现逻辑
判断传入的 list 集合类型,判断类型是否为 java.util.RandomAccess,如果是则采取java.util.Collections.SynchronizedRandomAccessList构造集合,如果不是则采取java.util.Collections.SynchronizedList构造集合。
源码中对应的add操作逻辑如下所示:
采取synchronized同步代码块的方式,对数据的add操作实现加锁!
方式二:new CopyOnWriteArrayList();
import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; public class ListTest { public static void main(String[] args) throws InterruptedException { Listlists = new CopyOnWriteArrayList<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
源码中的介绍如下:
显而易见,其逻辑如下所示:
调用add方法后,拿到java.util.concurrent.locks.ReentrantLock对象信息。
调用 lock.lock() 拿到锁!
将原数组对象copy操作,并创建原数组大小+1的新数组。
将新数据放入新数组中。
任何操作finally,都进行锁的释放!
性能方面
JUC包下的Lock操作,都比synchronized性能更好!
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级