
Java
phs999
这个作者很懒,什么都没留下…
展开
-
Java对象引用-强软弱虚(强引用、软引用、弱引用、虚引用)
目录(1)强引用(2)软引用(3)弱引用(4)虚引用强软弱虚(强引用、软引用、弱引用、虚引用)对应的是四种JVM回收堆内存的四种策略,不同的引用类型有不同的回收策略。(1)强引用package basic.RefTypeAndThreadLocal;import java.io.IOException;/** * 强引用,常见的new对象是强引用 */public class TestNormalReference { public stati..原创 2020-10-18 00:30:02 · 236 阅读 · 0 评论 -
ThreadLocal线程局部变量-多线程与高并发
ThreadLocal线程局部变量,实现了将对象变量保存在特定的线程对象中,仅对当前线程可见。我们在测试程序中,一个线程往ThreadLocal对象中放置对象,然后另一个对象来取对象取不到。public class TestThreadLocal { static ThreadLocal <Person> tl = new ThreadLocal<>(); public static void main(String[] args) { new Thre原创 2020-10-17 22:21:36 · 194 阅读 · 0 评论 -
JUC之AQS原理-多线程与高并发
AQS是AbstractQueuedSynchronizer的缩写,该类是java.util.concurrent.locks包下的一个核心基础类,实现的功能主要是控制多个线程进行排队获得锁。AQS有很多具体的实现子类,比如ReentranLock、CountDownLatch、Semaphor拿ReentranLock来说,其主要代码逻辑是依靠其内部抽象类Sync具体实现。Sync是AbstractQueuedSynchronizer的子类。原创 2020-10-17 19:15:17 · 271 阅读 · 0 评论 -
生产者与消费者(Java实现固定容量的容器支持阻塞存取操作)-多线程与高并发
介绍生产者与消费者模型实现的两种思路,用Java实现固定容量的容器支持阻塞存取操作,一种是使用wait-notifyAll控制线程的阻塞和唤醒,另一种是进一步使用Condition进行优化,实现对消费者和生产者线程的区分唤醒。原创 2020-10-16 23:08:32 · 337 阅读 · 0 评论 -
JUC之LockSupport-多线程与高并发
LockSupport的意思就是有个变量控制线程的是否阻塞。对应有两个方法park()和unpark(thread)。park()是说当前线程执行该方法后进入阻塞状态,需要再调用unpark(thread)解除阻塞限制。如果unpark(thread)先于park()执行,则该次park()不起作用不会使得线程阻塞。package basic.aqs.LockSupport;import java.util.concurrent.TimeUnit;import java.util.concurr原创 2020-10-12 00:13:34 · 311 阅读 · 0 评论 -
JUC之Exchanger-多线程与高并发
Exchanger支持两个线程交换指定类型T的值(对象的话是交换引用,基本类型的话直接交换值)一个线程在执行exchange()方法后进入阻塞等待状态(也可以提前指定要等待的时间),等待另一个线程调用同一个exchanger对象的exchange()方法交换完成后,线程不再阻塞,可以继续执行后面的代码。package basic.aqs.Exchanger;import java.util.concurrent.Exchanger;/** * Exchanger支持两个线程交换指定类.原创 2020-10-09 23:58:33 · 943 阅读 · 0 评论 -
JUC之ReadWriteLock-多线程与高并发
ReadWriteLock读写锁目前有两种实现,一种是ReentrantReadWriteLock类,一种是StampedLock。package basic.aqs.readWriteLock;import java.util.Random;import java.util.concurrent.atomic.LongAdder;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadW.原创 2020-10-09 23:49:39 · 145 阅读 · 1 评论 -
JUC之Semaphore-多线程与高并发
我们学习锁的时候,当一个线程获取到锁,它才可以正常执行;未获得锁的线程阻塞。而Semaphore也相当于锁,不过它可以定义锁的数量,即同一时间可以控制让多个线程都获得锁从而正常运行。它控制同一时间点并发执行线程的个数。也可以控制某个资源可被同时访问的个数。主要用于限流。用法就是一个acquire()方法用于获得锁,如果没有获得锁则线程阻塞;另一个方法就是release()方法,线程执行完成后释放锁。初始化时可以传参指定控制并发的数量。Semaphore s = new Semaphore(原创 2020-10-09 22:48:30 · 235 阅读 · 0 评论 -
JUC之Phaser-多线程与高并发
Phaser支持对于多个线程,阻塞控制统一完成到某个阶段后,再继续进行下一阶段的操作。即所有线程都完成当前阶段后,才可以进入下一阶段进行操作。以一个婚礼流程为例,比如分为到场、吃饭、离场等流程,必须所有人步调一致,人到齐才能开饭。p0 到达现场!新娘 到达现场!p3 到达现场!p1 到达现场!p2 到达现场!新郎 到达现场!p4 到达现场!所有人到齐了!7新娘 吃完!p2 吃完!p0 吃完!p1 吃完!p3 吃完!p4 吃完!新郎 吃完!所有人吃完了!7p3原创 2020-10-08 19:55:14 · 283 阅读 · 1 评论 -
JUC之CountDownLatch、CyclicBarrier-多线程与高并发
CountDownLatch实现了通过一个计数,来控制一个或多个线程是否需要一直阻塞等待。CyclicBarrier实现了通过一个计数,控制每满多少就进行一些操作,可用于多线程计算数据,最后汇总结果的场景。原创 2020-10-08 17:03:56 · 172 阅读 · 0 评论 -
volatile的线程可见性和禁止指令重排序-多线程与高并发
保证线程可见性-MESI-缓存一致性协议禁止指令重排序-DCL单例-Double Check LockObject o=new Object();new一个对象的三个步骤:a.开辟内存空间b.初始化、赋值c.将堆内存空间的地址赋给栈里的对象引用o。验证线程可见性的程序:/** * volatile 关键字,使一个变量在多个线程间可见 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必...原创 2020-10-06 13:54:55 · 322 阅读 · 0 评论 -
详解synchronized关键字(无锁、偏向锁、轻量级锁(自旋锁)、重量级锁四种锁状态)-多线程与高并发
介绍CAS(compare and swap)、对象内存分布、markword、synchronized中锁的状态(无锁、偏向锁、轻量级锁、重量级锁)研究、Java Object Layout原创 2020-09-26 14:11:26 · 1642 阅读 · 0 评论 -
啥是可重入锁,Synchronized与ReentrantLock-多线程与高并发
一个synchronized修饰的方法调用另一个synchronized修饰的方法,可以吗?介绍可重入锁的概念及两种实现方式(ReentrantLock和synchronized)原创 2020-09-17 23:35:51 · 459 阅读 · 0 评论 -
没写完就读产生脏读(写操作加锁读操作不加锁产生脏读)synchronized-多线程与高并发
模拟银行账户,对业务写方法加锁,对业务读方法不加锁,这样有什么后果?因为这种情况不能保证写操作完成后再进行读操作,没写完就读容易读到不准确的中间态数据,即产生脏读。/** * 模拟银行账户 * 对业务写方法加锁 * 对业务读方法不加锁 * 这样行不行? * * 容易产生脏读问题(dirtyRead) */package main.java.basic._synchronized;import java.util.concurrent.TimeUnit;pu...原创 2020-09-17 22:32:01 · 591 阅读 · 0 评论 -
Synchronized常见写法-多线程与高并发
线程安全本质上是多个线程操作同一数据,要保证数据的准确。而Synchronized提供了线程互斥访问,同一时刻只能有一个线程来执行特定方法实现对数据的操作。Synchronized修饰的可以是新建对象、当前对象this、成员方法、当前类的class对象、静态成员方法。原创 2020-09-17 04:14:33 · 309 阅读 · 0 评论 -
线程的状态与sleep()、yield()、join()方法-多线程与高并发
目录1、线程的状态:2、sleep、yield、join1、线程的状态:Thread类中有一个内部枚举类State,枚举了6种线程的状态。/** * A thread state. A thread can be in one of the following states: * <ul> * <li>{@link #NEW}<br> * A thread that has not yet start原创 2020-09-14 00:40:35 · 204 阅读 · 0 评论 -
run()和start()有啥区别,用run()启动线程行不行?以及创建线程的两种方法总结-线程与高并发
1、我用run()启动线程,不用start()行不行?2、创建线程的两种方式中,都调用start()方法了,但有什么区别呢?原创 2020-09-11 00:33:59 · 170 阅读 · 0 评论 -
软件开发设计思想与6大软件设计原则、23种设计模式目录-设计模式
软件开发设计思想与6大软件设计原则、23种设计模式目录及链接原创 2020-08-30 20:41:47 · 5733 阅读 · 0 评论 -
state状态模式-设计模式-行为型
1、需求场景某银行要开发一套信用卡业务系统,银行账户(Account)是该系统的核心类之一,通过分析,账户存在三种状态,且在不同状态下账户存在不同的行为,具体说明如下: (1) 如果账户中余额大于等于0,则账户的状态为正常状态(Normal State),此时用户既可以向该账户存款也可以从该账户取款; (2) 如果账户中余额小于0,并且大于-2000,则账户的状态为透支状态(Overdraft State),此时用户既可以向该账户存款也可以从该账户取款,但需要按天...原创 2020-08-30 17:29:39 · 910 阅读 · 0 评论 -
TemplateMethod模板方法-设计模式-行为型
定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。固定不变的方法用final限制,必须实现的用抽象方法,可以选择的重写或不重写则可以实现一个样例标准方法,由子类决定是否重写。package behavioral.templatemethod.example2;public abstract class ACourse { protected final void makeCourse(){ this.makePPT(); this.makeV...原创 2020-08-29 23:45:28 · 142 阅读 · 0 评论 -
Memento备忘录模式、序列化与反序列化-设计模式-行为型
通过写博客文章保存与回退的场景学习备忘录模式,同时介绍序列化与反序列。原创 2020-08-29 22:47:56 · 244 阅读 · 0 评论 -
Prototype原型模式-设计模式-创建型
介绍了Prototype原型模式设计模式的实现方式和关键点。深拷贝与浅拷贝问题如果不不注意,容易导致程序问题。最后给出了ArrayList中实现原型模式的方法。原创 2020-08-27 23:24:30 · 237 阅读 · 0 评论 -
bridge桥接模式-设计模式-结构型
1、场景毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及到的对象个数仅为3 + 12 = 15,远小于36,却能实现与36支蜡笔同样的功能。如果增加一种新型号的画笔,并且也需要具有12种颜色,对应的蜡笔需增加12支,而毛笔只需增加一支。https://blog.youkuaiyun.com/LoveLion/article/details/7464183分离场景...原创 2020-08-24 08:31:55 · 343 阅读 · 0 评论 -
Adapter/Wrapper适配器模式/接口转换器-设计模式-结构型
Adapter/Wrapper适配器模式/接口转换器-设计模式-结构型原创 2020-08-23 23:59:22 · 351 阅读 · 0 评论 -
Builder建造者/构建者模式-设计模式-创建型
构建者模式builder原创 2020-08-23 12:15:57 · 214 阅读 · 0 评论 -
通俗讲解visitor访问者模式及其与策略模式的比较-设计模式-表现型
电脑装机的场景学习访问者模式,并比较学习策略模式。原创 2020-08-21 01:22:35 · 1422 阅读 · 0 评论 -
Iterator迭代器模式与JDK实现分析应用-设计模式-行为型
Iterator迭代模式实现的类图与角色介绍,jdk中的源码实现原创 2020-08-19 06:00:55 · 236 阅读 · 0 评论 -
proxy代理模式-设计模式-结构型
静态代理与动态代理,JDK动态代理与cglib原创 2020-08-16 19:10:40 · 268 阅读 · 0 评论 -
flyweight享元模式/轻量级模式-设计模式-结构型
享元模式核心原理介绍学习及jdk源码应用介绍。原创 2020-08-14 01:51:02 · 190 阅读 · 0 评论 -
通俗理解组合模式(Composite)-设计模式-结构型
通过文件夹及文件、课程包与课程的例子,理解整体与局部的关系,从而理解组合模式。另外通过对JDK和Mybatis代码具体,展示该设计模式的应用场景。原创 2020-08-11 23:21:35 · 576 阅读 · 0 评论 -
通俗讲解Observer观察者模式(监听者模式)-设计模式-行为型
通俗讲解观察者模式的核心原理,并给出实际场景应用代码与源码解析。观察者模式的核心思路就是主动广播通知。维护一个观察者的列表,即被通知者的列表,然后根据事件源的某些状态变化,触发通知操作。然后观察者接收到通知后做出相应的操作。原创 2020-08-09 19:01:14 · 928 阅读 · 0 评论 -
6.使用装饰者模式扩展坦克代码-设计模式之坦克大战
复习总结装饰者模式的实现原理以及与继承的区别,同时介绍在坦克大战代码中应用中出现的问题,相应设计模式要在特定场景下发挥作用,不能为了设计模式而设计模式。装饰者模式的核心就是将待修饰类对象传参到装饰类,然后得到一个新的、更加强大、可以支持更多功能的修饰后的类对象。...原创 2020-08-08 11:16:07 · 465 阅读 · 0 评论 -
通俗详细讲解装饰者设计模式-设计模式-结构型
使用煎饼果子加蛋、加两个蛋、加辣椒等等具体需求的场景,给出使用装饰者模式的优化代码,体会该设计模式的优点。同时看一下JDK中的IO源码是怎么应用装饰者模式的,原创 2020-08-05 22:46:38 · 251 阅读 · 0 评论 -
5.使用中介者模式和责任链模式优化坦克大战代码-设计模式之坦克大战
复习总结中介者模式和责任链模式,并且介绍在坦克大战中的应用场景及优化逻辑,最终实现游戏对象之间的解耦和进一步满足开闭原则减少对原来代码的改动。原创 2020-07-29 23:18:14 · 355 阅读 · 0 评论 -
Chain of Responsibility Pattern责任链模式/职责链模式是怎么一回事?-设计模式
通过报销单审批、注册信息校验等等场景,理解责任链模式是怎么一回事。同时通过代码实现一个具体的场景,并通过Servlet中Filter过滤器的例子,加深对责任链模式的理解。原创 2020-07-29 00:16:59 · 259 阅读 · 0 评论 -
4.使用facade外观模式优化坦克大战代码-设计模式之坦克大战
使用facade外观模式简化TankFrame类,将炮弹类、坦克类、爆炸类之间的逻辑关系、碰撞检测等进行封装,封装为GameModelFacade类。原创 2020-07-19 13:03:27 · 286 阅读 · 0 评论 -
Mediator中介者模式/调停者模式-设计模式
Mediator中介者模式,又称调停者模式,实现了多个类之间交互的解耦。原创 2020-07-14 05:27:26 · 248 阅读 · 0 评论 -
facade外观模式/门面模式(通过积分商城的例子理解外观模式)-设计模式
facade外观模式,又称门面模式,通过积分商城的例子理解外观模式。原创 2020-07-12 14:59:42 · 441 阅读 · 0 评论 -
3.抽象工厂设计模式在坦克大战中的应用-设计模式之坦克大战
坦克大战使用抽象工厂模式优化代码,代码调整中的一些体会感悟。原创 2020-07-08 23:54:31 · 381 阅读 · 1 评论 -
抽象工厂设计模式-设计模式
抽象工厂设计模式,优点缺点、代码实现、在Mybatis源码中的应用。原创 2020-07-04 17:19:25 · 450 阅读 · 0 评论