![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
黄 坤
已毕业
展开
-
Java实现异步的四种方式
目录1、开线程2、Future3、CompletableFuture4、Async注解1、开线程/** * 开线程 */public class ThreadTest { public void test() { new Thread(() -> { //做处理 try { Thread.sleep(1000); } catch (InterruptedExcep原创 2021-06-07 16:11:02 · 12676 阅读 · 0 评论 -
原子整数
JUC并发包提供了:AtomicBooleanAtomicIntegerAtomicLong以AtomicInteger为例,一些简单的APIpackage com.sharing_model.no_lock;import java.util.concurrent.atomic.AtomicInteger;/** * AtomicInteger 测试 */public class AtomicIntegerTest { public static void main(原创 2020-12-13 13:06:00 · 389 阅读 · 0 评论 -
Java原子引用
目录1、 原子引用2、 ABA问题3、 AtomicStampedReference4、 AtomicMarkableReference1、 原子引用为什么需要原子引用?因为引用类型也需要被保护AtomicReferenceAtomicMarkableReferenceAtomicStampedReferencepackage com.sharing_model.no_lock;import java.math.BigDecimal;import java.util.ArrayList原创 2020-12-13 13:05:47 · 816 阅读 · 0 评论 -
字段更新器
AtomicReferenceFieldUpdaterAtomicIntegerFieldUpdaterAtomicLongFieldUpdater利用字段更新器,可以针对对象的某个域(Field)进行原子操作,只能配合volatile使用,否则会出现异常package com.sharing_model.no_lock;import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;/** * 字段更新器: ..原创 2020-12-13 13:05:32 · 142 阅读 · 0 评论 -
Java 原子累加器
为什么AtomicInteger等等有累加的方法,还需要另外搞一个原子累加器?因为原子累加器性能高package com.sharing_model.no_lock;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicLong;import java.util.concurrent.atomic.LongAdder;import java.util.function.原创 2020-12-13 13:04:54 · 980 阅读 · 0 评论 -
共享模型之不可变
目录1、转换问题2、不可变类的设计3、享元模式3.1 体现3.2 DIY 数据库连接池4、final原理4.1 设置final变量的原理4.2 获取final变量的原理5、无状态1、转换问题SimpleDataFormat不安全package com.sharing_model.immutable;import java.text.ParseException;import java.text.SimpleDateFormat;/** * 共享模型之不可变 * SimpleDataFo原创 2020-12-13 13:04:33 · 115 阅读 · 4 评论 -
Java线程池
1、自定义线程池package com.sharing_model.ThreadPool;import java.util.ArrayDeque;import java.util.Deque;import java.util.HashSet;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLo原创 2020-12-13 13:04:09 · 165 阅读 · 0 评论 -
Java异步模式之工作线程
目录1、定义2、饥饿3、解决饥饿4、创建多少线程池合适5、任务调度线程池1、使用Timer的坏处2、使用任务调度线程池的好处3、小例子6、Tomcat线程池7、Fork / Join1、概念2、使用3、改进1、定义2、饥饿package com.sharing_model.work_thread;import java.util.Arrays;import java.util.List;import java.util.Random;import java.util.concurrent原创 2020-12-13 13:03:52 · 140 阅读 · 0 评论 -
StampedLock
该类自1.8加入,是为了进一步优化读性能,它的特点时在使用读锁,写锁时都必须配合【戳】使用加解读锁long stamp = lock.readLock();lock.unlockRead(stamp); 加解写锁long stamp = lock.writeLock();lock.unlockWrite(stamp);乐观读,StampedLock支持tryOptimisticRead()方法(乐观读),读取完毕之后需要做一次戳校验,如果校验通过,表示这期间确实没有写操作,数据可以安全使用原创 2020-12-13 13:03:26 · 91 阅读 · 1 评论 -
Java 无锁
目录1、共享资源——无锁实现2、CAS的工作方式3、CAS 和 Volatile的关系4、为什么无锁效率高?5、CAS的特点1、共享资源——无锁实现package com.sharing_model.no_lock;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;/** * 下面代码有什么问题? 很明显的发现是线程不安全的 * 解决方式:原创 2020-12-12 19:23:41 · 365 阅读 · 0 评论 -
Java共享模型之内存
目录1、Java内存模型2、可见性3、可见性 VS 原子性4、终止模式之两线程终止模式4.1 错误思路4.2 正确思路5、设计模式——犹豫模式6、有序性7、volatile原理1、如何保证可见性2、如何保证有序性8、DCL 单例模式9、happens-before1、Java内存模型JMM即Java Memory Model,它定义了主存、工作内存抽象概念、底层对应着cpu寄存器、缓存、硬件内存、cpu指令优化等。JMM体现在以下几个方面原子性:保证指令不会受到线程上下文切换的影响可见性:保证指原创 2020-12-12 19:23:14 · 129 阅读 · 0 评论 -
Semaphore、CountDownLatch、CyclicBarrier
目录1、semaphore的作用2、改进数据库连接池3、acquire4、release5、countdownlatch6、CyclicBarrier1、semaphore的作用信号量,用来限制能同时访问共享资源的线程上限package com.sharing_model.juc;import java.util.concurrent.Semaphore;/** * 信号量,用来限制能同时访问共享资源的线程上限 */public class SemaphoreTest{ publ原创 2020-12-12 19:22:30 · 103 阅读 · 0 评论 -
多线程设计模式
目录1、固定运行顺序1、wait / notify 版本2、await / signal 版本3、park / unpark 版本2、交替运行顺序1、wait / notify 版本2、await / signal 版本3、park / unpark 版本1、固定运行顺序比如,必须先2后1打印1、wait / notify 版本package com.sharing_model.synchronous_mode;/** * 同步模式之顺序控制 * 固定运行顺序: wait notify版原创 2020-12-12 19:21:16 · 100 阅读 · 0 评论 -
ReentrantLock学习
目录3.21 ReentrantLock1、可重入2、可打断3、锁超时4、解决哲学家就餐问题5、公平锁6、条件变量3.21 ReentrantLock相对于synchronized它具备如下特点:可中断可设置超时时间可以设置为公平锁支持多个条件变量与synchronized一样,都支持可重入基本语法//获取值reentrantLock.lock();try { //临界区} finally { //释放锁 reentrantLock.unLock();}1、可重入原创 2020-12-12 17:41:39 · 107 阅读 · 0 评论 -
线程的活跃性分析
目录1、死锁2、死锁检测3、哲学家就餐问题4、活锁5、饥饿1、死锁有这样的情况:一个线程需要同时获取多把锁,这是就容易发生死锁t1线程获取了A对象锁,接下来想要获取B对象的锁t2线程获取了B对象锁,接下来想要获取A对象的锁package com.sharing_model.more_lock;import javax.crypto.spec.IvParameterSpec;/** * 死锁: * t1线程获取了A对象锁,接下来想要获取B对象的锁 * t2线程获取了B对象锁,接下来想要原创 2020-12-12 17:41:23 · 207 阅读 · 1 评论 -
Park & Unpark
它们是LockSupport类中的方法//暂停当线程LockSupport.park();//恢复某个线程的运行LockSupport.unpark(暂停线程对象)public class ParkAndUnpark { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { System.out.原创 2020-12-12 17:41:03 · 347 阅读 · 0 评论 -
异步模式之生产者、消费者
3.16 异步模式之生产者/消费者要点:和前面的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程一一对应消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据JDK中各种阻塞队列,采用的就是这种模式package com.sharing_model.producer_consumer;import java.util.Li原创 2020-12-12 17:40:22 · 264 阅读 · 0 评论 -
同步模式之保护性暂停
目录3.15 同步模式之保护性暂停1、基本使用2、拓展: 增加超时3、拓展: 增加测试4、原理之join5、扩展: 解耦3.15 同步模式之保护性暂停1、基本使用用一个线程等待另一个线程的执行结果要点:有一个结果需要从一个线程传递另一个线程,让他们关联同一个Object如果有结果不断从一个线程传递到另一个线程那么可以使用消息队列(见消费者、生产者)JDK中,join的实现,Future的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式package com.shari原创 2020-12-12 16:36:36 · 254 阅读 · 0 评论 -
sleep 和 wait 的区别
sleep(long n) 和 wait(long n) 的区别:sleep是Thread方法,而wait是Object的方法sleep不需要强制和synchronized配合使用,但wait需要和synchronized一起使用sleep在睡眠的同时,不会释放对象锁,但wait在等待的时候会释放对象锁。它们的状态都是TIMED_WAITINGpublic class WaitAndSleep { static final Object lock = new Ob.原创 2020-12-12 12:49:13 · 110 阅读 · 0 评论 -
wait & notify
目录1、wait / notify 原理2、API介绍3、练习1、wait / notify 原理Owner线程发现条件不满足,调用wait方法,即可进入WaitSet变为WAITING状态BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片BLOCKED线程会在Owner线程释放锁的时候被唤醒WAITING线程会在Owner线程调用notify或notifyAll时唤醒,但唤醒后并不意味着立刻获得锁,仍需进入EntryList重新竞争2、API介绍obj.wait原创 2020-12-11 15:35:16 · 82 阅读 · 0 评论 -
Synchronized加锁后线程的基本执行流程
当一个线程Thread-2执行到同步代码块,会判断其有没有指向一个monitor,如果没有的话,Thread-2就会占用Owner,其他的线程再次执行到同步代码块时,发现指向了monitor,其他的线程就会放到EntryList中,并处于阻塞操作,等待持有锁的资源完成。完成之后,就会从EntryList取出一个再执行。注意:synchronized必须是进入同一个对象的monitor才有上述效果不加synchronized的对象不会关联监视器,不遵从以上规则...原创 2020-12-11 15:26:44 · 319 阅读 · 0 评论 -
线程安全练习
目录1、卖票2、转账1、卖票package com.sharing_model.thread_no_safe;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Vector;/** * 模拟买票操作: 发现出现了线程安全问题 * 很难获得到预期结果(余票数 + 卖出去票数 = 原票数),没有发生指令交错现象 * * 解决方式:在sell方法上加上锁 *原创 2020-12-11 14:53:55 · 104 阅读 · 0 评论 -
线程的安全性分析
3.8 线程的安全性分析成员变量和静态变量是否线程安全?1、如果它们没有共享,则线程安全2、如果它们被共享了,根据它们的状态是否能够改变,又分两种情况 2.1 如果只有读操作,则线程安全 2.2 如果读写操作,则这段代码是临界区,需要考虑线程安全局部变量是否线程安全1、局部变量是线程安全的2、但局部变量引用的对象则未必 2.1 如果该对象没有逃离方法的作用访问,它是线程安全的 2.2 如果该对象逃离方法的作用范围,则需考虑线程安全局部变量为什么是线程安全的。方法原创 2020-12-11 14:49:24 · 101 阅读 · 0 评论 -
Java 共享带来的问题和解决方案
3.1 共享带来的问题两个线程对同一个数分别执行相同次数的+1和-1操作,那么最后的结果一定是0吗?目录3.1 共享带来的问题3.2 临界区3.3 竞态条件3.4 synchronize解决方案3.5 synchronized面对对象改进3.6 方法上的synchronizedpackage com.sharing_model;/** * 共享问题: * 两个线程对同一个数分别执行相同次数的+1和-1操作,那么最后的结果一定是0吗? */public class SharingProbl原创 2020-12-11 14:23:04 · 223 阅读 · 0 评论 -
线程状态(操作系统层面和Java层面)
目录1、五种状态(操作系统层面)2、六种状态(Java层面)1、五种状态(操作系统层面)【初始状态】仅在语言层面创建了线程对象,还未与操作系统线程相关联【可运行状态】指该线程已经被创建完成,可以由cpu调度执行【运行状态】指获取了cpu时间片运行中的状态1、当cpu时间片用完后,会从【运行状态】转换为【可运行状态】,会导致线程的上下文切换,进入阻塞状态【阻塞状态】1、如果调用了阻塞api,如BIO读取文件,这是线程实际上不会用到cpu,会导致线程上下文切换,进入【阻塞状态】原创 2020-12-11 12:15:19 · 503 阅读 · 0 评论 -
Java线程中常用的方法
目录1、 run 和 start2、getState3、sleep 和 yield4、setPriority 和 getPriority5、join6、interrupt7、两阶段终止模式7.1 错误思路7.2 正确思路8、打断park线程9、不推荐使用的方法10、主线程和守护线程方法名作用start()让线程进入就绪状态,每个线程对象的start方法只能调用一次run()新线程启动后会调用的方法join()等待线程运行结束getId()获得线程长整型的id原创 2020-12-11 12:03:32 · 137 阅读 · 0 评论 -
查看进程线程的方法
windows任务管理器查看进程和线程数,也可以用来杀死进程tasklist 查看进程taskkill 杀死进程linuxps -fe 查看所有进程ps -fT -p 查看某个进程的所有线程kill 杀死进程top 按大写H切换是否显示线程top -H -p 查看某个进程(PID)的所有线程Javajps命令查看所有的java进程jstack 查看某个java进程的所有线程状态jconsole查看某个java进程中线程的运行情况(图形.原创 2020-12-11 11:02:36 · 583 阅读 · 0 评论 -
Java中三种创建线程的方式
目录2.1 创建和运行线程2.1.1 直接使用Thread类创建线程2.1.2 使用Runnable配合Thread创建线程2.1.3 前两种创建方式的小结2.1.4 FutureTask配合Thread创建线程2.1 创建和运行线程2.1.1 直接使用Thread类创建线程package com.java_thread;import lombok.extern.slf4j.Slf4j;/** * 创建线程: 直接使用Thread类创建线程 */@Slf4j(topic = "c.Cre原创 2020-12-11 10:52:13 · 93 阅读 · 0 评论 -
(进程、线程),(并行、并发),(同步、异步)的理解
1、进程和线程1.1、进程和线程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hIIdLGyB-1607654523249)(C:/Users/lenovo/AppData/Roaming/Typora/typora-user-images/image-20201127095900340.png)]1.2、并行和并发单核cpu下,线程实际上还是串行执行的,操作系统中有一个组件,叫做任务调度器,将cpu的时间片交给不同的线程使用,只是由于cpu在线程间(时间片很短)的切原创 2020-12-11 10:46:00 · 146 阅读 · 0 评论 -
wait和sleep的区别
1.wait和sleep方法都可以使线程进入阻塞状态2.wait和sleep方法均是可中断方法,被中断后都会受到中断异常3.wait使Object的方法,而sleep是Thead特有的方法4.wait方法的执行必须在同步方法中进行,而sleep则不需要5.线程在同步方法中执行sleep方法时,并不会释放monitor的锁,而wait方法则会释放monitor的锁6.sleep方法短暂休眠之后会主动退出阻塞,而wait方法(没有指定时间)则需要被其他线程中断后才能退出阻塞...原创 2020-06-11 10:10:22 · 207 阅读 · 0 评论 -
狂神JUC——自旋锁
package com.company;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;//自旋锁public class SpinLock { public static void main(String[] args) { MySpinLock mySpinLock = new MySpinLock(); //线程T1,原创 2020-06-02 11:48:13 · 399 阅读 · 0 评论 -
狂神JUC——可重入锁
package com.company;//可重入锁public class ReentrantLock { public static void main(String[] args) { Phone phone = new Phone(); new Thread(phone::sms,"A").start(); new Thread(phone::sms,"B").start(); }}class Phone{ p原创 2020-06-02 11:46:23 · 367 阅读 · 0 评论 -
狂神JUC——CAS
1.CASpackage com.company.cas;import java.util.concurrent.atomic.AtomicInteger;// CAS compareAndSet : 比较并交换!(unsafe,自旋锁)public class CAS { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(1); .原创 2020-06-02 11:44:16 · 813 阅读 · 0 评论 -
狂神JUC——单例模式
1.饿汉式package com.company.singleton_pattern;//饿汉式(已经创建好,就等拿了,会浪费空间)public class Hungry { //构造器私有 private Hungry(){ } private static final Hungry hungry = new Hungry(); public static Hungry getInstance(){ return hungry;.原创 2020-06-02 11:40:29 · 475 阅读 · 0 评论 -
狂神JUC——异步回调
package com.company;//异步回调import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.TimeUnit;/**异步调用:CompletableFuture * 异步执行-》成功回调-》失败回调 */public class AsynchronousCallback { pu原创 2020-06-02 11:37:14 · 408 阅读 · 0 评论 -
狂神JUC——ForkJoin
package com.company;import java.util.concurrent.ExecutionException;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.ForkJoinTask;import java.util.concurrent.RecursiveTask;import java.util.stream.LongStream;/**ForkJoin:并行执行任务 *原创 2020-06-02 11:35:03 · 402 阅读 · 0 评论 -
狂神——链式编程
package com.company.newcharacter;//链式编程public class ChainProgramming { public static void main(String[] args) { User user = new User(); user.setName("hk").setPassword(123).setAge(20); System.out.println("name:"+user.getName()原创 2020-06-02 11:33:43 · 309 阅读 · 0 评论 -
狂神——Stream流式计算
package com.company.newcharacter;//流式计算import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * 题目要求:一分钟内完成此题,只能用一行代码实现! * 现在有5个用户!筛选: * 1、密码必须是偶数 * 2、年龄必须大于23岁 * 3、用户名转为大写字母 * 4、用户名字母倒着排序 * 5、只输出一个用户! *///mysql,集合本原创 2020-06-02 11:31:15 · 496 阅读 · 0 评论 -
狂神JUC——四大函数接口
1.函数型接口package com.company.newcharacter.function_interface;import java.util.function.Function;//函数式接口:只有一个方法的接口//四大函数接口:Consumer、Function、Predicate、Supplier//Function:函数式接口public class FunctionTest { public static void main(String[] args) {.原创 2020-06-02 11:29:34 · 391 阅读 · 0 评论 -
狂神JUC——7大参数及自定义线程池
package com.company.thread_pool;import java.util.concurrent.BlockingQueue;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadFactory;import java.util.concurrent.TimeUnit;//7种参数public class SevenKindsOfParameters原创 2020-06-02 11:22:18 · 462 阅读 · 0 评论