JUC (java.util.concurrent)
1、什么是线程?什么是进程?
2、多线程的状态?
public enum State {
//6种状态
NEW,
RUNNABLE, //可运行
BLOCKED, //阻塞
WAITING, //等待:一直等待,不见不散
TIMED_WAITING,//过期不候
TERMINATED;
}
3、并发?并行?※ ※ ※
并发:同一时间间隔,交替执行任务。
并行:同一时刻执行多个任务。
4、三个售票员卖票
(1) 线程 操作 资源类
(2)高内聚 低耦合
代码在github上。
5、Lambda表达式
函数式为实现接口:接口中有一个为实现的函数。jdk8接口,新增了静态方法和默认方法。因为有一个抽象方法,所以调用哪个方法是确定的。
如何实现函数式接口:当只有一个抽象方法时,默认就是函数式接口。第二就是注解声明下,@FunctionalInterface
口诀:拷贝小括号,写死右箭头,落地大括号。
6、ArrayList是线程安全的吗?不是
并发修改会报错:java.util.ConcurrentModificationException
Vector是线程安全的吗?是的,但是使用的synchronized,效率低?为啥synchronized就效率低呢?
它是重量级锁,让线程排队一次执行,并发最差。
怎么让ArrayList安全呢?
List<String> list = Collections.synchronizedList(new ArrayList<>());
//但是不推荐,高并发不好
7、juc最终boss,企业高并发用这个
List list = new CopyOnWriteArrayList();//写时复制技术
高并发集合容器
public class NotSafeDemo {
public static void main(String[] args) {
notSafeHashMap();
}
private static void notSafeHashMap() {
Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 4));
System.out.println(map);
}, String.valueOf(i)).start();
}
}
private static void notSafeHashSet() {
Set<String> hashSet = new CopyOnWriteArraySet<String>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
hashSet.add(UUID.randomUUID().toString().substring(0, 4));
System.out.println(hashSet);
}, String.valueOf(i)).start();
}
}
private static void noSafeArrayList() {
List list = new CopyOnWriteArrayList();//写时复制技术
//并发写,会报错:java.util.ConcurrentModificationException
for (int i = 0; i < 30; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 4));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
底层原理:写时复制技术(写之前先复制一份,然后添加完,把引用指向写后的数组)
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
JUC (java.util.concurrent)的更多相关文章
- java.util.concurrent包
在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Exec ...
- 深入理解java:2.3. 并发编程 java.util.concurrent包
JUC java.util.concurrent包, 这个包是从JDK1.5开始引入的,在此之前,这个包独立存在着,它是由Doug Lea开发的,名字叫backport-util-concurrent ...
- JUC(java.util.concurrent)
在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异步 IO 和轻 ...
- 《The java.util.concurrent Synchronizer Framework》 JUC同步器框架(AQS框架)原文翻译
一.论文简介 闲来无事,看看源码,发现了一篇JDK作者的论文<The java.util.concurrent Synchronizer Framework>主要描述了作者对Abstrac ...
- java.util.concurrent包详细分析--转
原文地址:http://blog.csdn.net/windsunmoon/article/details/36903901 概述 Java.util.concurrent 包含许多线程安全.测试良好 ...
- 并发之java.util.concurrent.atomic原子操作类包
15.JDK1.8的Java.util.concurrent.atomic包小结 14.Java中Atomic包的原理和分析 13.java.util.concurrent.atomic原子操作类包 ...
- Java多线程:CAS与java.util.concurrent.atomic
锁的几种概念 悲观锁 总是假设最坏的情况,每次获取数据都认为别人会修改,所以拿数据时会上锁,一直到释放锁不允许其他线程修改数据.Java中如synchronized和reentrantLock就是这种 ...
- 014-并发编程-java.util.concurrent之-CountDownLatch
一.概述 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,指定的一个或多个线程等待其他线程执行完成后执行. 能够使一个线程等待其他线程完成各自的工 ...
- 原子类java.util.concurrent.atomic.*原理分析
原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...
随机推荐
- Java学习笔记之——多线程
多线程编程 程序: 进程:一个程序运行就会产生一个进程 线程:进程的执行流程,一个进程至少有一个线程,称为主线程 如:QQ聊着天,同时在听音乐 一个进程可以有多个线程,多个线程共享同一个进程的资源 线 ...
- mybatis报错:Caused by: java.lang.IllegalArgumentException: Caches collection already contains value for com.crm.dao.PaperUserMapper
一.问题 eclipse启动时报下面的错误: Caused by: java.lang.IllegalArgumentException: Caches collection already cont ...
- 【转】Js正则表达式
//校验是否全由数字组成 var patrn=/^[0-9]{1,20}$/ //校验登录名:只能输入5-20个以字母开头.可带数字.“_”.“.”的字串 var patrn=/^[a-zA-Z]{1 ...
- 【代码笔记】Web-CSS-CSS Text(文本)
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- android 摇一摇+震动+声音效果
文章链接:https://mp.weixin.qq.com/s/n6EXvfmpNPtWM1kEnGgwUA 摇一摇红包效果已经是老生常谈的了,利用手机的传感器识别摇一摇,同时过程中进行动画+震动+声 ...
- Android application使用总结
简介: Application和Activity.Service一样,都是Android框架的一个系统组件,每一个应用都有一个Application,Application的生命周期也就是整个app的 ...
- Git在商业项目中的使用流程
一 引言 这一篇文章还是记录我在杭州工作的总结. 我刚来公司的时候,对Git的使用很头痛,因为在学校里面很少用这个东西,即使用,一般也只有一个分支,不会出现代码冲突和代码合并的情况.但是公司里面一个项 ...
- log4j详细配置
参考博客:https://blog.csdn.net/sinat_30185177/article/details/73550377 log4j..很简单好用的一个记录日志的东东,正因为好用,本人从来 ...
- python 实例四
https://www.cnblogs.com/evablogs/p/6754981.html 题目:输入某年某月某日,判断这一天是这一年的第几天? 程序分析: 月份天数: 月份 天数 2 平年28天 ...
- 使用Spring.Net
一:在Asp.net MVC中应该怎样使用Spring.Net? 1:先导入dll文件. 2:将案例中的Config文件夹拷贝到项目中. 3:修改Config文件夹中的相关的配置信息. 4:修改Web ...