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相关推荐

  1. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  2. 【并发入门】Java 并发编程学习笔记

    注:该笔记主要记录自 B站 up主 遇见狂神说的个人空间_哔哩哔哩_bilibili 1.什么是 JUC Java 工具类中的 并发编程包 学习:源码 + 官方文档 业务:普通的线程代码 Thread ...

  3. 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)

    文章目录 第一章 多线程并发编程 第二节 线程安全问题 1.2.1 线程安全之可见性问题 多线程中的问题 从内存结构到内存模型 工作内存缓存 指令重排序 内存模型的含义 Shared Variable ...

  4. Java并发编程学习笔记(二)多线程的理解及多线程的优点

    多线程的优点 原文:http://tutorials.jenkov.com/java-concurrency/benefits.html 作者:Jakob Jenkov        翻译:古圣昌   ...

  5. Java并发编程学习笔记——volatile与synchronized关键字原理及使用

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 一.vo ...

  6. JAVA并发编程学习笔记之CAS操作

    http://blog.csdn.net/aesop_wubo/article/details/7537960 CAS操作 CAS是单词compare and set的缩写,意思是指在set之前先比较 ...

  7. JAVA并发编程学习笔记------FutureTask

    FutureTask是Future和Callable的结合体.传统的代码是这样写的 Future f = executor.submit(new Callable()); 然后通过Future来取得计 ...

  8. 张孝祥并发编程学习笔记实践

    1.要用到共同数据(包括同步锁)的若干个方法应该归在同一个类身上,这种设计正好体现了高类聚和程序的健壮性 2.在迭代集合的过程中不能对集合进行修改 转载于:https://www.cnblogs.co ...

  9. 多线程编程学习笔记——使用并发集合(三)

    接上文 多线程编程学习笔记--使用并发集合(一) 接上文 多线程编程学习笔记--使用并发集合(二) 四.   使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费 ...

  10. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

最新文章

  1. Nat. Commun | 用于全基因组药物重定位的系统网络算法
  2. seaborn heatmap绘制热力图cmap参数的含义
  3. CIPS青工委学术沙龙总结:推荐系统前沿进展丨附回放和课件下载
  4. Win7 Vista下的输入法问题
  5. MFC中的Document-View结构
  6. Vue+Axios同步请求
  7. 使用Spring Data MongoDB和Spring Boot进行数据聚合
  8. java学习(74):GUL面板
  9. iOS OC语言: Block底层实现原理
  10. python创建数据库字数不限制_textarea字数限制方法一例
  11. 还不会python面相对象?活该单身(面向对象基础+交互关系)
  12. 【机器学习】深度学习开发环境搭建
  13. 算数基本定理 + 例题
  14. 【leetcode】Copy List with Random Pointer (hard)
  15. 【windows】Windows电脑怎么卸载服务/删除服务?
  16. VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path
  17. 软件架构之分层模式 Layered Architecture
  18. ardruino控制继电器_arduino控制继电器
  19. unity 贴图合并_[2018.4]Unity版本迭代与效果提升
  20. SAP BAPI创建交货单拆单原因调查

热门文章

  1. 传感器的时间同步系统
  2. Ubuntu:conda的安装与使用
  3. 2月14 大数据处理的基本算法
  4. main函数中argc和argc参数解释
  5. 6-汇编语言中段的使用+dw+start标号
  6. 在工作中常用到的SQL
  7. 确认从博客园搬家到FPA博客园
  8. 太阳能光伏发电行业将重入佳境
  9. 负载均衡常见问题之会话保持-粘滞会话(Sticky Sessions)
  10. DOM操作style样式——link、style、p style=''的区别