JUC
Vodka_boy
这个作者很懒,什么都没留下…
展开
-
JMM和volatile
JMM和volatile volatile: java内置关键字,轻量级的同步机制 (锁机制的削弱版) volatile特性: 保证可见性 不 保证原子性 禁止指令重排 可见性:一种通知机制 JMM: Java内存模型 JMM是虚拟的不存在的东西(概念,约定) 约定: 线程加锁前,必须读取,内存中最新的,变量值 线程解锁前,必须将自己对变量的修改,同步到内存 加锁,解锁是同一把锁 java对主内存的操作* 执行引擎<–操作use–线程工作内存<–加载load–拷贝变量<–原创 2020-05-15 16:06:47 · 193 阅读 · 0 评论 -
ForkJoin分支合并计算
ForkJoin分支合并计算 ForkJoin 常用其子抽象类 ForkJoinPool ForkJoinTask:子类 RecursiveTask public abstract class ForkJoinTask<V> implements Future<V>, Serializable //实现了Future就是实现了Callable public abstract class RecursiveTask<V> extends ForkJoinTa原创 2020-05-15 16:00:06 · 219 阅读 · 0 评论 -
线程池的使用及解析
线程池 避免了线程不停的 开启 / 关闭 对系统资源的浪费,和对性能的损耗,方便统一管理线程,线程复用,控制并发数 事先准备好空的线程,有线程需要就分发给他,用完归还 线程池使用后 需要 手动 关闭 executorService.shutdown(); 三大方法 使用Executors.new方法 创建线程池 不建议使用 此处用于举例 使用Executors.newSingleThreadExecutor(); 创建只存在一个线程的线程池 public class Test01 { public原创 2020-05-15 15:56:03 · 139 阅读 · 0 评论 -
阻塞队列
阻塞队列 BlockingQueue 我们常用其实现类:ArrayBlockingQueue LinkedBlockingQueue … BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<String>(3);//参数:队列大小 有四种API(四组对应重载方法): 操作/方法 抛出异常 不抛出异常,有返回值 一直阻塞,等待 超时等待 添加 add("") offer("") put("") off原创 2020-05-15 15:53:07 · 109 阅读 · 0 评论 -
JUC常用辅助类及读写锁
JUC常用辅助类* (1).CountDownLatch 手动减 /** * CountDownLatch减法计数器 */ public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(6);//设定计数器原始值 for原创 2020-05-15 15:49:13 · 122 阅读 · 0 评论 -
使用Callable创建线程
Callable创建线程 与Runnable相比: 两者都是为了执行另一个线程 但是 Callable 创建线程方式一 实现 Runnable public class TestCallable { public static void main(String[] args) { new Thread(new MyThread()).start(); } } /** * 另一条线程 */ class MyThread implements Runnable{原创 2020-05-15 15:47:12 · 360 阅读 · 0 评论 -
多线程下的集合类
多线程集合类 (1).不安全的list 单线程: public class TestList { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(UUID.randomUUID().toString().substr原创 2020-05-15 15:39:15 · 819 阅读 · 0 评论 -
生产者消费者模型
生产者消费者模型: 生产者生产后 通知 正在 等待 的消费之消费 线程通信 **注意:**判断时不能使用if()否则将 出现 虚假唤醒 的情况<线程越多错误越明显> 应使用while()判断 因为if判断只判断一次且执行时不会停止导致同时判断到num=1或者0 结果出现错误 所有等待应出现在循环中 用if判断的话,唤醒后线程会从wait之后的代码开始运行,但是不会重新判断if条件,直接继续运行if代码块之后的代码,而如果使用while的话,也会从wait之后的代码运行,但是唤醒后会重新判断循环条原创 2020-05-15 15:36:44 · 102 阅读 · 0 评论 -
Lock锁
Lock锁 传统synchronized锁: /** * 卖票例子 */ public class SynTest { /** * 主函数 模拟多线程 使用并发操作 */ public static void main(String[] args){ //获得同一实体 MyTicket myTicket = new MyTicket(); //创建 并 执行线程 让他不停卖票 new Thread(()原创 2020-05-15 15:33:55 · 166 阅读 · 0 评论 -
JUC、进程线程、并发并行
JUC并发编程 学习笔记 一、什么是JUC 他指的是Java中的几个包即: java.util java.util.concurrent** java.util.concurrent.atomic java.util.concurrent.locks java.util.function 普通的多线程:使用Thread或Runnable(无返回值,效率低于Callable) 二、进程 线程 进程:程序运行即开辟一个进程,一个进程可由多个线程组成,至少一个线程 线程:是进程中的一个具体任务,比如qq音乐的原创 2020-05-15 15:31:13 · 132 阅读 · 0 评论