- 博客(56)
- 收藏
- 关注
原创 父类、接口、功能类的个人理解
2.常按照功能来创建,抽象函数为实现该功能必备的方法。在定义方法的时候尽量的少,减少对实现类的限制。2.所有子类都需要的方法都可以放到父类中,就算没有那么兼容也没有关系,子类可以重写方法来规避。1.类的根本属性才创建父类,所有的子类都需要的属性、方法全部放到父类。1.对外暴露,实现类实现指定功能,然后暴露指定方法供外部调用。类:最常见,能够实现所有功能。功能类:实现特定功能的类。
2024-04-26 16:44:19
229
原创 Spring AOP拦截抽象类(父类)中方法失效问题
http://www.javashuo.com/article/p-fawbpakz-nw.html
2023-01-16 17:03:34
480
1
原创 redisTemplate.opsForSet().isMember(key, value) key不存在
redisTemplate.opsForSet().isMember(key, value) key不存在
2022-11-25 16:24:47
2333
原创 多线程教程(三十四)AQS 原理
多线程教程(三十四)AQS 原理1.概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 state 状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源
2022-03-05 15:37:03
283
原创 多线程教程(三十三) forkjoin
多线程教程(三十三) fork/join一、概念Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率Fork/Join 默认会创建与 cpu 核心数大小相
2022-03-04 16:27:52
561
原创 多线程教程(三十二)ThreadPoolExecutor
多线程教程(三十二)ThreadPoolExecutor1.线程池状态ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量状态名高 3位接收新任务处理阻塞队列任务说明RUNNING111YYSHUTDOWN000NY不会接收新任务,但会处理阻塞队列剩余任务STOP001NN会中断正在执行的任务,并抛弃阻塞队列任务TIDYING010--任务全执行完毕,活动线程为 0 即将
2022-03-03 18:38:36
492
原创 多线程教程(三十一)自定义线程池
多线程教程(三十一)自定义线程池后面部分根据上图设计了一个自定义的线程池,其中对线程池的线程进队列设计了拒绝策略,分别为:死等带超时等待让调用者放弃任务执行让调用者抛出异常让调用者自己执行任务步骤1:自定义拒绝策略接口@FunctionalInterface // 拒绝策略interface RejectPolicy<T> { void reject(BlockingQueue<T> queue, T task);}步骤2:自定义任务队列c
2022-03-03 10:31:25
224
原创 多线程教程(三十)享元模式
多线程教程(三十)享元模式1. 简介定义 英文名称:Flyweight pattern. 当需要重用数量有限的同一类对象时wikipedia: A flyweight is an object that minimizes memory usage by sharing as much data as possible with other similar objects出自 “Gang of Four” design patterns归类 Structual patterns2. 体现2
2022-02-28 14:59:28
151
原创 多线程教程 (二十九)不可变设计
多线程教程 (二十九)不可变设计常见的不可见性设计包括时间格式和string以string为例,说明一下不可变设计的要素public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /
2022-02-28 14:20:06
213
原创 多线程教程(二十八)unsafe类
多线程教程(二十八)unsafe类Unsafe 对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用,只能通过反射获得public class UnsafeAccessor { static Unsafe unsafe; static { try { Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setA
2022-01-20 18:25:09
133
原创 多线程教程(二十七)cpu缓存、伪共享
2多线程教程(二十七)cpu缓存、伪共享一、CPU缓存结构查看 cpu 缓存⚡ root@yihang01 ~ lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 1On-line CPU(s) list: 0Thread(s) per core: 1Core(s) per socket: 1Socket(s): 1NUMA node(s): 1Vendor
2022-01-20 17:16:48
221
原创 多线程教程(二十六)字段更新器、原子累加器
多线程教程(二十六)字段更新器、原子累加器一、字段更新器常见的字段更新器:AtomicReferenceFieldUpdater // 域 字段AtomicIntegerFieldUpdaterAtomicLongFieldUpdater利用字段更新器,可以针对对象的某个域(Field)进行原子操作,只能配合 volatile 修饰的字段使用,否则会出现异常Exception in thread "main" java.lang.IllegalArgumentException
2022-01-20 10:56:55
248
原创 多线程教程(二十五)原子数组
多线程教程(二十五)原子数组常用的原子数组主要有三种:AtomicIntegerArrayAtomicLongArrayAtomicReferenceArrayAtomicIntegerArray数组里面存储整型;AtomicLongArray数组里面存储长整型;AtomicReferenceArray数组里面存储引用类型;举例:/** 参数1,提供数组、可以是线程不安全数组或线程安全数组 参数2,获取数组长度的方法 参数3,自增方法,回传 array, inde
2022-01-20 10:35:11
470
原创 多线程教程(二十四)CAS+volatile
多线程教程(二十四)CAS+volatile获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。即一个线程对 volatile 变量的修改,对另一个线程可见。注意volatile 仅仅保证了共享变量的可见性,让其它线程能够看到最新值,但不能解决指令交错问题(不能保证原子性)CAS 必须借助 volatile 才能读取到共
2022-01-19 16:37:21
492
原创 多线程教程(二十四)CAS+volatile
多线程教程(二十四)CAS+volatile获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。即一个线程对 volatile 变量的修改,对另一个线程可见。注意volatile 仅仅保证了共享变量的可见性,让其它线程能够看到最新值,但不能解决指令交错问题(不能保证原子性)CAS 必须借助 volatile 才能读取到共
2022-01-19 16:17:44
176
原创 多线程教程(二十三) 无锁实现线程安全
多线程教程(二十三) 无锁实现线程安全题目描述:总额10000元,1000个人取钱,每人取10块,取完余额刚好为0.加锁方法class AccountUnsafe implements Account { private Integer balance; public AccountUnsafe(Integer balance) { this.balance = balance; } @Override public synchronized
2022-01-19 15:52:48
3343
原创 多线程教程(二十二)happens-before原则
多线程教程(二十二)happens-before原则happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛开以下 happens-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读可见线程解锁 m 之前对变量的写,对于接下来对 m 加锁的其它线程对该变量的读可见static int x;static Object m = new Object();new Thread(()->{ sy
2022-01-19 15:16:58
130
原创 多线程教程(二十一)double-checked locking 问题
多线程教程(二十一)double-checked locking 问题一、double-checked locking的不完善实例以著名的 double-checked locking 单例模式为例public final class Singleton { private Singleton() { } private static Singleton INSTANCE = null; public static Singleton getInstance() {
2022-01-19 14:20:03
273
原创 多线程教程(二十)volatile原理
多线程教程(二十)volatile原理volatile 的底层实现原理是内存屏障,Memory Barrier(Memory Fence)对 volatile 变量的写指令后会加入写屏障对 volatile 变量的读指令前会加入读屏障volatile能够保证可见性和有序性,但是不能保证原子性。1.如何保证可见性首先了解下volatile中得两个屏障——写屏障和读屏障写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中public void actor2
2022-01-18 15:23:37
141
原创 多线程教程(十九)JMM三大特性 原子性、可见性、有序性
多线程教程(十九)JMM三大特性JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响1.可见性(1)可能遇到的问题——退不出的循环先来看一个现象,main 线程对 run 变量的修改对于 t 线程不可见,导致了 t
2022-01-18 11:33:06
1437
1
原创 多线程教程(十八)ReentrantLock
多线程教程(十八)ReentrantLock一、基本使用方法// 获取锁reentrantLock.lock();try { // 临界区} finally { // 释放锁 reentrantLock.unlock();}二、ReentrantLock特点相对于 synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入1.可重入可重入是指同一个线
2022-01-17 17:58:51
243
1
原创 多线程教程(十七)活锁、饥饿
多线程教程(十七)活锁、饥饿1. 活锁活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束,例如public class TestLiveLock { static volatile int count = 10; static final Object lock = new Object(); public static void main(String[] args) { new Thread(() -> { // 期望减
2022-01-17 15:44:50
447
原创 多线程教程(十六)活跃性(死锁问题)
多线程教程(十六)活跃性(死锁问题)一、死锁介绍有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁t1 线程 获得 A对象 锁,接下来想获取 B对象 的锁 t2 线程 获得 B对象 锁,接下来想获取 A对象 的锁 例:Object A = new Object();Object B = new Object();Thread t1 = new Thread(() -> { synchronized (A) { log.debug("lock A");
2022-01-17 15:19:46
332
原创 多线程教程(十五)多线程的状态转换
多线程教程(十五)多线程的状态转换一、多线程状态多线程状态详细解析见之前的文章二、线程状态之间的转换每个序号代表途中所示的线程状态转换,本章节以java的线程状态(六种)进行介绍NEW –> RUNNABLE当调用 t.start() 方法时,由 NEW --> RUNNABLERUNNABLE <–> WAITINGt 线程用 synchronized(obj) 获取了对象锁后调用 obj.wait() 方法时,t 线程从 RUNNABLE
2022-01-17 14:03:57
157
原创 多线程教程(十四)parkUnpark 使用及原理
多线程教程(十四)park/Unpark 使用及原理一、基本使用它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park(); // 恢复某个线程的运行LockSupport.unpark(暂停线程对象)先 park 再 unparkThread t1 = new Thread(() -> { log.debug("start..."); sleep(1); log.debug("park..."); LockSup
2022-01-17 11:21:22
273
原创 多线程教程(十三) 设计模式之balking(犹豫模式)
多线程教程(十三) 设计模式之balking(犹豫模式)一、定义Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回和单例模式有点相似,结合单例模式,就是线程安全的单例模式二、实现public class MonitorService { // 用来表示是否已经有线程已经在执行启动了 private volatile boolean starting; public void start() {
2022-01-13 18:01:55
184
原创 多线程教程(十二)同步模式之保护性暂停
多线程教程(十二)同步模式之保护性暂停一、定义保护性暂停,即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式二、实现class GuardedObject { private
2022-01-13 17:46:34
153
原创 多线程教程(十一)waitnotify的正确使用
多线程教程(十一)wait/notify的正确使用一、基础API介绍wait/notify是object的方法obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法wait() 方法
2022-01-13 15:46:05
234
原创 多线程教程(十) waitnotify原理
多线程教程(十) wait/notify原理一、为什么需要wait/notify由于条件不满足,小南不能继续进行计算但小南如果一直占用着锁,其它人就得一直阻塞,效率太低于是老王单开了一间休息室(调用 wait 方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进屋直到小M将烟送来,大叫一声 [ 你的烟到了 ] (调用 notify 方法)小南于是可以离开休息室,重新进入竞争锁的队列总结来说,就是在线程持有锁的时候,有时
2022-01-13 11:23:10
316
原创 The POM for xxxx is missing, no dependency information available解决方案
解决方案有两种一、直接在父类包进行package参考 https://blog.csdn.net/iamlihongwei/article/details/61197984二、先在父类包下install,然后再在子类包中package参考 https://blog.csdn.net/weixin_43978695/article/details/105390612?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t
2022-01-12 17:06:26
1028
原创 多线程教程(九)偏向锁
多线程教程(九)偏向锁轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作。Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现这个线程 ID 是自己的就表示没有竞争,不用重新 CAS。以后只要不发生竞争,这个对象就归该线程所有偏向锁可以设置,可以在运行时设置开启和关闭偏向锁的理解需要markWord,所以在开头放32位系统的Mark Word 结构|-----------------------
2022-01-06 13:44:40
850
原创 多线程教程(八)轻量级锁、锁膨胀
多线程教程(八)轻量级锁、锁膨胀一、轻量级锁1.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是 synchronizedjdk6之后优化了synchronized,之后synchronized会自己对锁进行判断使用不同等级的锁假设有两个方法同步块,利用同一个对象加锁static final Object obj = new Object();public static
2022-01-05 15:50:55
452
原创 多线程教程(七)monitor概念、synchronized原理浅析
多线程教程(七)monitor概念一、Java 对象头java对象通常在内存中主要由两部分组成,一是对象头,另一部分是对象中的成员变量。以 32 位虚拟机为例,对象头如下所示:(1)普通对象|--------------------------------------------------------------| | Object Header (64 bits) ||------------------------------------|------------
2022-01-05 14:16:10
512
原创 多线程教程(六)线程共享带来的问题、synchronized
多线程教程(六)线程共享带来的问题、synchronized多线程虽然能够带来性能上提升,但是也会带来一些线程共享的问题两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?static int counter = 0;public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (
2022-01-04 18:21:25
201
原创 多线程(五)线程状态
多线程(五)线程状态一、操作系统层面五种状态【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联常见的创建了线程,还没有start()就属于这种状态【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行常见的运行了start()等待cpu分配时间片就属于这种状态【运行状态】指获取了 CPU 时间片运行中的状态 当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换【阻塞状态】 如果
2022-01-04 15:27:10
99
原创 多线程教程(四)常见方法
多线程教程(四)常见方法1.多线程方法汇总方法名static功能说明注意start()启动一个新线程,在新的线程运行 run 方法中的代码start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateExceptionrun()新线程启动后会调用的方法如果在构造 Thread 对象时传递了 Runnable 参数,则线程启动后会调用 Ru
2021-12-27 11:38:54
223
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人