JUC与JVM并发编程学习笔记04
JUC与JVM并发编程学习笔记04
JUC强大的辅助类
CountDownLatch
package test.testThread.juc;import java.util.concurrent.CountDownLatch;
/*** 多线程模拟七个人上晚自习,班长最后一个走负责锁上门*/
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <=6 ; i++) {new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t离开教室");countDownLatch.countDown();},String.valueOf(i)).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t班长关门走人");}
}
运行结果
2 离开教室
3 离开教室
6 离开教室
1 离开教室
5 离开教室
4 离开教室
main 班长关门走人
CyclicBarrier
package test.testThread.juc;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/*** 多线程模拟集齐七颗龙珠召唤神龙*/
public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{System.out.println("出来吧,神龙!");});for (int i = 1; i <=7 ; i++) {final int tempInt = i;new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t收集到第"+tempInt+"龙珠");try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}},String.valueOf(i)).start();}}
}
2 收集到第2龙珠
3 收集到第3龙珠
4 收集到第4龙珠
1 收集到第1龙珠
5 收集到第5龙珠
6 收集到第6龙珠
7 收集到第7龙珠
出来吧,神龙!
Semaphore
package test.testThread.juc;import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;/*** 多线程模拟6辆汽车抢3个车位* 抢红包、砸金蛋于此类似*/
public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore = new Semaphore(3); //模拟共享资源,3个空车位for (int i = 1; i <=6 ; i++) {new Thread(()->{try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t抢占到了车位");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"\t离开了车位");} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}}).start();}}}
Thread-0 抢占到了车位
Thread-4 抢占到了车位
Thread-1 抢占到了车位
Thread-1 离开了车位
Thread-4 离开了车位
Thread-5 抢占到了车位
Thread-0 离开了车位
Thread-2 抢占到了车位
Thread-3 抢占到了车位
Thread-5 离开了车位
Thread-2 离开了车位
Thread-3 离开了车位
ReentrantReadWriteLock
ReadWriteLock
红蜘蛛
缓存
ReadWriteLock
package test.testThread.juc;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** 多个线程可以同时读一个资源,但不允许同时写,也不允许同时读写。* 写是资源独占的,要保证数据的一致性*/
public class ReadWriteLockDemo {public static void main(String[] args) {MyCache myCache = new MyCache();for (int i = 1; i <5 ; i++) {final int tempInt = i;new Thread(()->{myCache.put(tempInt+"",tempInt);},String.valueOf(i)).start();}for (int i = 1; i <5 ; i++) {final int tempInt = i;new Thread(()->{myCache.get(tempInt+"");},String.valueOf(i)).start();}}
}class MyCache{private volatile Map<String,Object> map = new HashMap<>();private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();public void put(String key,Object value){//写锁readWriteLock.writeLock().lock();try{System.out.println(Thread.currentThread().getName()+"\t写入数据");try {//模拟网络延时TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}map.put(key,value);System.out.println(Thread.currentThread().getName()+"\t写入完成");}catch (Exception e){e.printStackTrace();}finally {readWriteLock.writeLock().unlock();}}public void get(String key){//读锁readWriteLock.readLock().lock();try{System.out.println(Thread.currentThread().getName()+"\t读取数据");try {//模拟网络延时TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}Object result = map.get(key);System.out.println(Thread.currentThread().getName()+"\t读取完成"+result);}catch (Exception e){e.printStackTrace();}finally {readWriteLock.readLock().unlock();}}
}
2 读取数据
1 读取数据
1 读取完成null
2 读取完成null
1 写入数据
1 写入完成
3 读取数据
3 读取完成null
2 写入数据
2 写入完成
3 写入数据
3 写入完成
4 写入数据
4 写入完成
4 读取数据
4 读取完成4
阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
package test.testThread.juc;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class BlockingQueueDemo {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);System.out.println(blockingQueue.add("a"));System.out.println(blockingQueue.add("b"));System.out.println(blockingQueue.add("c"));System.out.println(blockingQueue.offer("c"));
// System.out.println(blockingQueue.add("c"));System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.poll());
// System.out.println(blockingQueue.element());
// System.out.println(blockingQueue.remove());// blockingQueue.put("A");
// blockingQueue.put("A");
// blockingQueue.put("A");//抛出异常 add remove element//特殊值 offer(e) poll peek//阻塞 put take//超时 offer(e,time,unit) poll(time,unit)}
}
true
true
true
false
a
b
c
null
JUC与JVM并发编程学习笔记04相关推荐
- 基于《狂神说Java》JUC并发编程--学习笔记
前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...
- 【并发入门】Java 并发编程学习笔记
注:该笔记主要记录自 B站 up主 遇见狂神说的个人空间_哔哩哔哩_bilibili 1.什么是 JUC Java 工具类中的 并发编程包 学习:源码 + 官方文档 业务:普通的线程代码 Thread ...
- 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)
文章目录 第一章 多线程并发编程 第二节 线程安全问题 1.2.1 线程安全之可见性问题 多线程中的问题 从内存结构到内存模型 工作内存缓存 指令重排序 内存模型的含义 Shared Variable ...
- Java并发编程学习笔记(二)多线程的理解及多线程的优点
多线程的优点 原文:http://tutorials.jenkov.com/java-concurrency/benefits.html 作者:Jakob Jenkov 翻译:古圣昌 ...
- Java并发编程学习笔记——volatile与synchronized关键字原理及使用
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 一.vo ...
- JAVA并发编程学习笔记之CAS操作
http://blog.csdn.net/aesop_wubo/article/details/7537960 CAS操作 CAS是单词compare and set的缩写,意思是指在set之前先比较 ...
- JAVA并发编程学习笔记------FutureTask
FutureTask是Future和Callable的结合体.传统的代码是这样写的 Future f = executor.submit(new Callable()); 然后通过Future来取得计 ...
- 张孝祥并发编程学习笔记实践
1.要用到共同数据(包括同步锁)的若干个方法应该归在同一个类身上,这种设计正好体现了高类聚和程序的健壮性 2.在迭代集合的过程中不能对集合进行修改 转载于:https://www.cnblogs.co ...
- 多线程编程学习笔记——使用并发集合(三)
接上文 多线程编程学习笔记--使用并发集合(一) 接上文 多线程编程学习笔记--使用并发集合(二) 四. 使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费 ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
最新文章
- Nat. Commun | 用于全基因组药物重定位的系统网络算法
- seaborn heatmap绘制热力图cmap参数的含义
- CIPS青工委学术沙龙总结:推荐系统前沿进展丨附回放和课件下载
- Win7 Vista下的输入法问题
- MFC中的Document-View结构
- Vue+Axios同步请求
- 使用Spring Data MongoDB和Spring Boot进行数据聚合
- java学习(74):GUL面板
- iOS OC语言: Block底层实现原理
- python创建数据库字数不限制_textarea字数限制方法一例
- 还不会python面相对象?活该单身(面向对象基础+交互关系)
- 【机器学习】深度学习开发环境搭建
- 算数基本定理 + 例题
- 【leetcode】Copy List with Random Pointer (hard)
- 【windows】Windows电脑怎么卸载服务/删除服务?
- VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path
- 软件架构之分层模式 Layered Architecture
- ardruino控制继电器_arduino控制继电器
- unity 贴图合并_[2018.4]Unity版本迭代与效果提升
- SAP BAPI创建交货单拆单原因调查