自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

phs999的博客

个人笔记与总结

  • 博客(136)
  • 资源 (2)
  • 收藏
  • 关注

原创 详解synchronized关键字(无锁、偏向锁、轻量级锁(自旋锁)、重量级锁四种锁状态)-多线程与高并发

介绍CAS(compare and swap)、对象内存分布、markword、synchronized中锁的状态(无锁、偏向锁、轻量级锁、重量级锁)研究、Java Object Layout

2020-09-26 14:11:26 1608

原创 软件开发设计思想与6大软件设计原则、23种设计模式目录-设计模式

软件开发设计思想与6大软件设计原则、23种设计模式目录及链接

2020-08-30 20:41:47 5468

原创 Prototype原型模式-设计模式-创建型

介绍了Prototype原型模式设计模式的实现方式和关键点。深拷贝与浅拷贝问题如果不不注意,容易导致程序问题。最后给出了ArrayList中实现原型模式的方法。

2020-08-27 23:24:30 228

原创 6.使用装饰者模式扩展坦克代码-设计模式之坦克大战

复习总结装饰者模式的实现原理以及与继承的区别,同时介绍在坦克大战代码中应用中出现的问题,相应设计模式要在特定场景下发挥作用,不能为了设计模式而设计模式。装饰者模式的核心就是将待修饰类对象传参到装饰类,然后得到一个新的、更加强大、可以支持更多功能的修饰后的类对象。...

2020-08-08 11:16:07 453

原创 5.使用中介者模式和责任链模式优化坦克大战代码-设计模式之坦克大战

复习总结中介者模式和责任链模式,并且介绍在坦克大战中的应用场景及优化逻辑,最终实现游戏对象之间的解耦和进一步满足开闭原则减少对原来代码的改动。

2020-07-29 23:18:14 325

原创 策略模式(示例1:通过实现Comparator接口定义不同的比较策略;示例2:促销策略)-设计模式

策略模式(示例1:通过实现Comparator接口定义不同的比较策略,实现普通对象排序;示例2:促销策略的定义与扩展)-设计模式

2020-06-21 19:37:18 435

原创 链表-单向链表、双向链表、链表反转、删除链表指定指定值

目录单向链表双向链表链表反转删除链表中指定的所有值单向链表package basic.linkedList;public class SingleNode { public SingleNode next; public int value; public SingleNode(int value) { this.value = value; } public static SingleNode reverseS

2021-02-22 08:35:23 330 2

原创 算法对数器

有些问题我们知道怎么算,算法如何写有些问题我们只知道怎么试,即低性能的算法能保证结果正确,据此逐步调试出更高性能的算法。通俗讲对数器就是生成随机样本,使用可靠算法和新算法分别计算结果,并比较结果。结果在大样本下多次比对相同,则新算法认为可靠。下面是一个选择排序的例子:package basic.util;import java.util.Arrays;/** * 对数器 */public class DsqUtil { public stati...

2021-02-22 08:10:28 352

原创 linux定时删除指定文件shell脚本

vi delete.sh输入以下内容#! /bin/bashdata_path="/home/test/logs"expire_time=1function deletefiles(){ for file in `find $1 -name "DefaultAuditRecorder.2*"` do local name=$file local modifyDate=$(stat -c %Y $file) r..

2021-02-08 17:37:41 1153

原创 RocketMQ 保证消息顺序消费

保证RocketMQ消息顺序消费的关键主要有以下几点:保证生产者消费者用同一topic保证生产者消费者用同一topic下的同一个queue(默认一个topic下有4个queue)发消息的时候用一个线程去发送消息消费的时候 只用一个线程去消费一个queue里的消息(默认MessageListenerConcurrently使用20个线程去消费处理消息)或者使用MessageListenerOrderly如果多个queue都有消息,只能保证每个单个queue里的消费是顺序的

2021-01-12 03:41:11 1982 1

原创 ActiveMQ可能存在的问题-消息丢失、重复消费、消息堆积

ActiveMQ等消息中间件可能存在的问题(消息丢失、重复消费、消息堆积)及发生场景与解决方案

2021-01-05 23:15:27 3247

原创 ActiveMQ-request/response请求/响应模型的几种实现

目录1、QueueRequestor2、TemporaryQueue3、JMSCorrelationID1、QueueRequestor同步阻塞,想法多少消息,就要开多少线程。 public QueueRequestor(QueueSession session, Queue queue) throws JMSException { super(); if(queue == null) { th.

2021-01-05 07:26:47 416

原创 ActiveMQ-仅浏览查看不消费-Browser

ActiveMQ-仅浏览查看不消费-Browser

2021-01-03 15:26:21 595

原创 ActiveMQ-springboot-demo示例

使用springboot构建启动ActiveMQ的生产端及消费端demo示例

2021-01-03 15:17:34 258 1

原创 ActiveMQ-分组分发

ActiveMQ可实现定向分发,负载均衡

2021-01-02 04:52:15 458

原创 ActiveMQ-死信配置项及丢弃和重新消费

https://blog.csdn.net/z69183787/article/details/88534988当对消息设置存活过期时间时,消息超过时间仍然未被消费,则会自动移动到死信队列中。DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。producer.setTimeToLive(1);//设置消息的存活时间 producer.send(message);默认的队列名称为ActiveMQ.DLQ ,也可以通过修改配置文件指定。修改死信.

2021-01-02 04:36:34 1174

原创 ActiveMQ-MessageListener异步回调处理

对于消息的接收来说,最基础的写法是Message message = consumer.receive();这种方式是同步阻塞的,只有收到消息才会继续执行下面的代码。进一步,可以考虑使用异步的方式,定义一个监听器,负责处理收到的消息。 consumer.setMessageListener(new MyListener());具体的Listener类要实现MessageListener接口。在onMessage()方法中进行消息的处理。package phs.act...

2021-01-02 04:30:01 980

原创 ActiveMQ-生产者消费者java代码示例-事务、消息确认、持久化、优先级、超时过期

事务、消息确认、持久化、优先级、超时过期

2021-01-01 02:29:34 604

原创 ActiveMQ-mysql持久化

ActiveMQ默认开启持久化,使用自带的文件数据库kahadb。启用mysql持久化需要修改配置文件\conf\activemq.xml。修改内容如下:(1)添加数据库连接的bean注入<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.j.

2021-01-01 02:24:10 510 4

原创 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 222

原创 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 185

原创 JUC之AQS原理-多线程与高并发

AQS是AbstractQueuedSynchronizer的缩写,该类是java.util.concurrent.locks包下的一个核心基础类,实现的功能主要是控制多个线程进行排队获得锁。AQS有很多具体的实现子类,比如ReentranLock、CountDownLatch、Semaphor拿ReentranLock来说,其主要代码逻辑是依靠其内部抽象类Sync具体实现。Sync是AbstractQueuedSynchronizer的子类。

2020-10-17 19:15:17 253

原创 生产者与消费者(Java实现固定容量的容器支持阻塞存取操作)-多线程与高并发

介绍生产者与消费者模型实现的两种思路,用Java实现固定容量的容器支持阻塞存取操作,一种是使用wait-notifyAll控制线程的阻塞和唤醒,另一种是进一步使用Condition进行优化,实现对消费者和生产者线程的区分唤醒。

2020-10-16 23:08:32 330

原创 windows使用批处理bat控制打印机自动打印测试页(可设置定时自动打印)

rundll32 printui.dll,PrintUIEntry /k /n\\计算机全名\打印机名称新建文本,后缀名由txt改为bat,复制以上内容修改替换一下自己电脑的计算机全名以及要调用的打印机名称。计算机全名在“此电脑(我的电脑)-右键属性-计算机全名”处查看。打印机名称在“控制面板-查看设备和打印机”处查看。如果需要定时执行,可以使用windows自带的定时任务功能进行配置,具体参见https://www.cnblogs.com/gcgc/p/11594467.htm..

2020-10-15 12:55:38 6324 1

原创 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 298

原创 JUC之Exchanger-多线程与高并发

Exchanger支持两个线程交换指定类型T的值(对象的话是交换引用,基本类型的话直接交换值)一个线程在执行exchange()方法后进入阻塞等待状态(也可以提前指定要等待的时间),等待另一个线程调用同一个exchanger对象的exchange()方法交换完成后,线程不再阻塞,可以继续执行后面的代码。package basic.aqs.Exchanger;import java.util.concurrent.Exchanger;/** * Exchanger支持两个线程交换指定类.

2020-10-09 23:58:33 933

原创 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 140 1

原创 JUC之Semaphore-多线程与高并发

我们学习锁的时候,当一个线程获取到锁,它才可以正常执行;未获得锁的线程阻塞。而Semaphore也相当于锁,不过它可以定义锁的数量,即同一时间可以控制让多个线程都获得锁从而正常运行。它控制同一时间点并发执行线程的个数。也可以控制某个资源可被同时访问的个数。主要用于限流。用法就是一个acquire()方法用于获得锁,如果没有获得锁则线程阻塞;另一个方法就是release()方法,线程执行完成后释放锁。初始化时可以传参指定控制并发的数量。Semaphore s = new Semaphore(

2020-10-09 22:48:30 223

原创 JUC之Phaser-多线程与高并发

Phaser支持对于多个线程,阻塞控制统一完成到某个阶段后,再继续进行下一阶段的操作。即所有线程都完成当前阶段后,才可以进入下一阶段进行操作。以一个婚礼流程为例,比如分为到场、吃饭、离场等流程,必须所有人步调一致,人到齐才能开饭。p0 到达现场!新娘 到达现场!p3 到达现场!p1 到达现场!p2 到达现场!新郎 到达现场!p4 到达现场!所有人到齐了!7新娘 吃完!p2 吃完!p0 吃完!p1 吃完!p3 吃完!p4 吃完!新郎 吃完!所有人吃完了!7p3

2020-10-08 19:55:14 266 1

原创 JUC之CountDownLatch、CyclicBarrier-多线程与高并发

CountDownLatch实现了通过一个计数,来控制一个或多个线程是否需要一直阻塞等待。CyclicBarrier实现了通过一个计数,控制每满多少就进行一些操作,可用于多线程计算数据,最后汇总结果的场景。

2020-10-08 17:03:56 169

原创 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 303

原创 Oracle Golden Gate(ogg)进程的删除与重建

ogg运行维护,可能会经常性的出现问题,一般可以根据日志及报错信息解决,但是若果解决不了,重建进程将是一个好的选择。本文介绍ogg的进程重建操作。

2020-09-30 22:47:53 5173

原创 啥是可重入锁,Synchronized与ReentrantLock-多线程与高并发

一个synchronized修饰的方法调用另一个synchronized修饰的方法,可以吗?介绍可重入锁的概念及两种实现方式(ReentrantLock和synchronized)

2020-09-17 23:35:51 441

原创 没写完就读产生脏读(写操作加锁读操作不加锁产生脏读)synchronized-多线程与高并发

模拟银行账户,对业务写方法加锁,对业务读方法不加锁,这样有什么后果?因为这种情况不能保证写操作完成后再进行读操作,没写完就读容易读到不准确的中间态数据,即产生脏读。/** * 模拟银行账户 * 对业务写方法加锁 * 对业务读方法不加锁 * 这样行不行? * * 容易产生脏读问题(dirtyRead) */package main.java.basic._synchronized;import java.util.concurrent.TimeUnit;pu...

2020-09-17 22:32:01 568

原创 Synchronized常见写法-多线程与高并发

线程安全本质上是多个线程操作同一数据,要保证数据的准确。而Synchronized提供了线程互斥访问,同一时刻只能有一个线程来执行特定方法实现对数据的操作。Synchronized修饰的可以是新建对象、当前对象this、成员方法、当前类的class对象、静态成员方法。

2020-09-17 04:14:33 299

原创 线程的状态与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 195

原创 run()和start()有啥区别,用run()启动线程行不行?以及创建线程的两种方法总结-线程与高并发

1、我用run()启动线程,不用start()行不行?2、创建线程的两种方式中,都调用start()方法了,但有什么区别呢?

2020-09-11 00:33:59 166

原创 state状态模式-设计模式-行为型

1、需求场景某银行要开发一套信用卡业务系统,银行账户(Account)是该系统的核心类之一,通过分析,账户存在三种状态,且在不同状态下账户存在不同的行为,具体说明如下: (1) 如果账户中余额大于等于0,则账户的状态为正常状态(Normal State),此时用户既可以向该账户存款也可以从该账户取款; (2) 如果账户中余额小于0,并且大于-2000,则账户的状态为透支状态(Overdraft State),此时用户既可以向该账户存款也可以从该账户取款,但需要按天...

2020-08-30 17:29:39 834

原创 TemplateMethod模板方法-设计模式-行为型

定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。固定不变的方法用final限制,必须实现的用抽象方法,可以选择的重写或不重写则可以实现一个样例标准方法,由子类决定是否重写。package behavioral.templatemethod.example2;public abstract class ACourse { protected final void makeCourse(){ this.makePPT(); this.makeV...

2020-08-29 23:45:28 136

原创 Memento备忘录模式、序列化与反序列化-设计模式-行为型

通过写博客文章保存与回退的场景学习备忘录模式,同时介绍序列化与反序列。

2020-08-29 22:47:56 236

跟我一起写makefile

makefile,c++

2017-08-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除