自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 资源 (1)
  • 收藏
  • 关注

原创 多线程学习三十二:自定义线程池

import lombok.extern.slf4j.Slf4j;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.ReentrantLock;/** * @aut

2021-07-02 15:57:50 134

原创 多线程学习三十一:不可变设计

大家更为熟悉的 String 类也是不可变的,以它为例,说明一下不可变设计的要素public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the str

2021-07-02 15:51:20 202

原创 多线程学习三十:Atomic

常用API常见原子类:AtomicInteger、AtomicBoolean、AtomicLong构造方法:public AtomicInteger():初始化一个默认值为0的原子型Integerpublic AtomicInteger(int initialValue):初始化一个指定值的原子型Integer常用方法://测试 incrementAndGet(),getAndIncrement(),getAndAdd,addAndGet方法 AtomicInteger integer = n

2021-06-01 21:18:10 462

原创 多线程学习二十九:保护共享资源通过有锁和无锁实现

首先有一个账户类:interface Account { // 获取余额 Integer getBalance(); // 取款 void withdraw(Integer amount); /** * 方法内会启动 1000 个线程,每个线程做 -10 元 的操作 * 如果初始余额为 10000 那么正确的结果应当是 0 */ static void demo(Account account) { List

2021-05-24 22:45:35 154

原创 多线程学习二十八:原子性,可见性,有序性

可见性可见性- 保证指令不会受 cpu 缓存的影响static boolean run = true;public static void main(String[] args) throws InterruptedException { Thread t = new Thread(()->{ while(run){ // .... } }); t.start(); sleep(1); run = false;}在这个例子中,线程t不会如预想的停下来。因为初始状态, t 线

2021-05-24 21:18:53 242

原创 多线程学习二十七:同步模式之顺序控制(顺序输出和交替输出)

固定运行顺序使用 wait notifypublic class Test39 { // 用来同步的对象 static Object obj = new Object(); // t2 运行标记, 代表 t2 是否执行过 static boolean t2runed = false; public static void main(String[] args) { Thread t1 = new Thread(() -> {

2021-05-16 16:14:36 124

原创 多线程学习二十六:ReentrantLock

ReentrantLock相对于 synchronized 它具备如下区别特点:可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入基本语法// 获取锁reentrantLock.lock();try { // 临界区} finally { // 释放锁 reentrantLock.unlock();}可重入可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁。如果是不可重入锁

2021-05-10 23:21:10 98

原创 多线程学习二十五:活锁

活锁活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束@Slf4j(topic = "c.test28:")public class Test30 { static volatile int count = 10; static final Object lock = new Object(); public static void main(String[] args) { new Thread(() -> { // 期望

2021-05-09 19:31:53 64

原创 多线程学习二十四:哲学家就餐问题

哲学家就餐问题有五位哲学家,围坐在圆桌旁。他们只做两件事,思考和吃饭,思考一会吃口饭,吃完饭后接着思考。吃饭时要用两根筷子吃,桌上共有 5 根筷子,每位哲学家左右手边各有一根筷子。如果筷子被身边的人拿着,自己就得等待@Slf4j(topic = "c.test29:")public class Test29 { public static void main(String[] args) { Chopstick c1 = new Chopstick("1");

2021-05-09 19:30:05 154

原创 多线程学习二十三:死锁

死锁有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁t1 线程 获得 A对象 锁,接下来想获取 B对象 的锁 t2 线程 获得 B对象 锁,接下来想获取 A对象 的锁@Slf4j(topic = "c.test28:")public class Test28 { public static void main(String[] args) { Object A = new Object(); Object B = new Object();

2021-05-09 18:18:37 94

原创 多线程学习二十二:多把锁

多把锁一间大屋子有两个功能:睡觉、学习,互不相干。现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低. 解决方法是准备多个房间(多个对象锁)@Slf4j(topic = "c.test27:")public class Test27 { public static void main(String[] args) { BigRoom bigRoom = new BigRoom(); new Thread(() -> {

2021-05-09 18:15:31 269

原创 多线程学习二十一:线程状态的转换

情况 1: NEW --> RUNNABLE当调用 t.start() 方法时,由 NEW --> RUNNABLE情况 2: RUNNABLE <–> WAITING当线程用 synchronized(obj) 获取了对象锁后调用 obj.wait() 方法时,t 线程从 RUNNABLE --> WAITING调用 obj.notify() ,obj.notifyAll(),t.interrupt() 时竞争锁成功,t 线程从 WAITING --&.

2021-04-26 21:04:53 101

原创 多线程学习二十:Park & Unpark原理

基本使用它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park(); // 恢复某个线程的运行LockSupport.unpark(暂停线程对象)应用先 park 再 unparkThread t1 = new Thread(() -> { log.debug("start..."); sleep(1); log.debug("park..."); LockSupport.park();

2021-04-25 20:25:24 596

原创 多线程学习十九:生产者消费者

异步模式之生产者/消费者定义与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据JDK 中各种阻塞队列,采用的就是这种模式消息类public class Message { private int id; private Object message; p

2021-04-11 22:31:02 124

原创 多线程学习十八:同步模式之保护性暂停

定义即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式首先看看 Guarded Suspension的实现class GuardedObject { private Object

2021-04-11 22:22:32 106

原创 多线程学习十八:wait和notify

API 介绍obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒wait() 方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。无限制等待,直到被notify 为止wait(long n) 有时限的等待, 到 n 毫秒后结束等待,或是未到等待时间被 not

2021-04-11 21:23:15 97

原创 多线程学习十七:synchronized锁升级过程

Monitor 概念在了解Monitor 之前我们首先来了解Java 对象头以 32 位虚拟机为例普通对象数组对象其中 Mark Word 结构为Monitor :被翻译为监视器或管程,每个 Java 对象都可以关联一个 Monitor 对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的MarkWord中就被设置指向Monitor对象的指针(Monitor 是操作系统层面的)分析:刚开始 Monitor 中 Owner 为 null,当 Thread-2 执行

2021-03-31 16:38:05 148

原创 多线程学习十六:转账线程安全问题

package com.concurrent.test4;import lombok.extern.slf4j.Slf4j;import java.util.Random;@Slf4j(topic = "c.test11:")/** *买票问题 */public class Test15 { public static void main(String[] args) throws InterruptedException { //创建两个账户相互转账,每人开始拥有

2021-03-14 17:25:46 538

原创 多线程学习十五:卖票线程安全问题

package com.concurrent.test4;import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Vector;import java.util.concurrent.TimeUnit;@Slf4j(topic = "c.test11:")/** *买票问题 */public

2021-03-14 17:23:01 130

原创 多线程学习十四:Java中常见线程安全类

常见线程安全类* String* Integer* StringBuffer* Random* Vector* Hashtable* java.util.concurrent 包下的类这里说它们是线程安全的是指,多个线程同时调用 它们同一个实例的某一个方法时,是线程安全的。线程安全类方法的组合分析下面代码是否线程安全?Hashtable table = new Hashtable();// 线程1,线程2if( table.get("key") == null) { ta

2021-03-14 17:16:58 120

原创 多线程学习十三: 变量的线程安全分析

成员变量和静态变量是否线程安全1.如果没有被共享,则线程安全2.如果被共享了,根据它们的状态是否能够改变,又分两种情况2.1如果只有读操作,则线程安全2.2如果有读写操作,则这段代码是临界区,需要考虑线程安全这个例子就证明成员变量被共享后线程不安全ArrayList<String> list = new ArrayList<>(); public void method1(int loopNumber) { for (int i = 0; i <

2021-03-14 17:00:25 120

原创 多线程学习十二:线程八锁(synchronized实践)

例一: public static void main(String[] args) { Number n1 = new Number(); new Thread(() -> { n1.a(); }).start(); new Thread(() -> { n1.b(); }).start(); }}class Number{ public syn

2021-03-14 16:45:16 112

原创 多线程学习十一:多线程对共享资源的访问

首先介绍两个概念:临界区 Critical Section:一个程序运行多个线程本身是没有问题的,但是问题出在多个线程访问共享资源。多个线程读共享资源其实也没有问题,但是在多个线程对共享资源读写操作时发生指令交错,就会出现问题,一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区竞态条件 Race Condition:多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件下面代码的执行结果是多少呢? static int counter =

2021-03-09 14:23:26 677

原创 多线程学习十:设计模式 -两阶段打断

代码实现:public class Thread11 { public static void main(String[] args) throws InterruptedException { TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination(); twoPhaseTermination.start(); TimeUnit.SECONDS.sleep(3);

2021-03-07 00:39:14 176

原创 多线程学习九:煮茶算法

阅读华罗庚《统筹方法》,给出烧水泡茶的多线程解决方案,提示参考图二,用两个线程(两个人协作)模拟烧水泡茶过程文中办法乙、丙都相当于任务串行而图一相当于启动了 4 个线程,有点浪费用 sleep(n) 模拟洗茶壶、洗水壶等耗费的时间附:华罗庚《统筹方法》统筹方法,是一种安排工作进程的数学方法。它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用。怎样应用呢?主要是把工序安排好。北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090洗水

2021-03-07 00:36:18 900

原创 多线程学习八:while (true)用法

在项目中我们有时通过while (true) 来循环接受消息,但如果在单核cpu上这样使用的话会造成cpu使用率达到100%,所以我们通过sleep让线程间隔性的执行。这样避免while(true) 空转浪费 cpu,这时可以使用 yield 或 sleep 来让出 cpu 的使用权给其他程序public static void main(String[] args){ while (true) { System.out.println("========+++==

2021-03-07 00:29:16 4496

原创 多线程学习七:java线程的六种状态

操作系统将线程分为五种状态初始状态:仅是在语言层面创建了线程对象,还未与操作系统线程关联可运行状态:(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行运行状态:指获取了 CPU 时间片运行中的状态,当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换阻塞状态:如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入阻塞状态等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态

2021-03-07 00:26:40 113

原创 多线程学习六:守护线程

守护线程设置守护线程的方法:setDaemon(true);默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程(通过setDaemon方法),只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。垃圾回收器线程就是一种守护线程Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求public static void main(Str

2021-03-07 00:11:40 167 2

原创 多线程学习五:isInterrupted与interrupted区别

用 interrupt 打断 park(阻塞)线程isInterrupted() 判断是否被打断, 不会清除 打断标记不会清除 打断标记不会清除 打断标记interrupted 判断当前线程是否被打断 会清除 打断标记public static void main(String[] args) throws InterruptedException { test3(); } private static void test3() throws Interr

2021-03-07 00:06:36 116

原创 多线程学习四:start、run、sleep、yield、join、interrupt介绍及用法

start与run方法的区别import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "c.Thread03:")/** start与run方法的区别 */public class Thread04 { public static void main(String[] args) { Thread t1 = new Thread("t1"){ @Override public vo

2021-03-07 00:01:29 709

原创 多线程学习三:线程运行原理 查看线程的栈与栈帧

运用debug模式在你要查看的方法上打上断点注意Suspend模式设为:THread模式然后debug运行模式运行代码途中就是我main线程运行的栈帧,关于栈帧的解释:Java 虚拟机栈是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。Java 内存可以粗糙的区分为堆内存(Heap)和栈内存 (Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。 (实际上,Java 虚拟机栈是由一个个栈帧组成,而每个栈

2021-03-06 18:31:31 368

原创 多线程学习二:实现Callable接口通过FutureTask包装器来创建Thread线程

通过实现Callable接口和FutureTask实现的方法,创建并启动线程步骤如下(注意:我把步骤合并了详细请看代码步骤)①创建一个类MyCallble并实现Callable接口,然后重写call方法,必须返回数据,要不然报错!call()方法比run()方法功能要强大。②创建MyCallable实现类的对象;创建FutureTask对象,并将myCallable实现类的对象作为参数传递到FutureTask的构造器中。③创建Thread对象并将FutureTask对象作为参数传递Thread的构造

2021-03-06 18:10:56 299

原创 多线程学习一:Runnable与Thread创建线程的区别

继承Thread类创建线程通过继承Thread类的方法,来创建并启动多线程的步骤如下:定义Thread类的子类MyThread,并重写该类的run()方法,该方法的方法体定义的是线程需要完成的任务,run()方法也称为线程执行体;创建Thread子类的实例,也就是创建了线程对象;通过调用线程的start()方法启动线程。实现Runnable接口创建线程通过实现Runnable接口的方法,创建并启动线程步骤如下:定义Runnable接口的实现类,同样要重写run()方法这是线程的执行体,T

2021-03-06 17:50:52 275

原创 jconsole使用

jconsole 远程监控配置再电脑输入:jconsole 会出现如下界面如果要查看本地连接,点击连接即可如果要查看远程:需要以如下方式运行你的 java 类java -Djava.rmi.server.hostname=ip地址 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=连接端口 -Dcom.sun.management.jmxremote.ssl=是否安全连接 -Dcom.sun.managem

2021-03-03 17:16:59 416 1

原创 linux学习笔记

linux学习笔记VI/VIM编辑器一般模式以 vi 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用『复制、贴上』来处理你的文件数据。常用语法yy (功能描述:复制光标当前一行)​ y数字y/数字yy (功能描述:复制一段(从第几行到第几行))p (功能描述:箭头移动到目的行粘贴)u (功能描述:撤销上一

2021-02-25 10:59:55 504

转载 redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to…

解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to…今天重启游戏服务器在连接redis数据库时突然报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data

2020-12-08 20:26:32 248

夜夜爱消除

基于C语言写的消消乐,大家可以学下 如果不对希望理解,毕竟新手

2018-01-12

空空如也

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

TA关注的人

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