
多线程与高并发
学习java多线程
二进制杯莫停
欲速则不达,慢而有为
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CountDownLatch用例 以及 日志pom依赖
【代码】CountDownLatch用例 以及 日志pom依赖。原创 2023-02-22 10:37:31 · 185 阅读 · 0 评论 -
JDK1.7 HashMap死循环形成的原因是什么?
这篇文章就只分析HashMap死循环形成的原因,死循环只在JDK1.7出现。原因:死循环形成是在扩容转移元素的时候发生的void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return; } Entry[] newT原创 2021-01-07 15:32:04 · 538 阅读 · 0 评论 -
AQS实现 -- 自定义不可重入锁
1、什么是AQS2、自定义实现不可重入锁package AQS;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQueuedSynchronizer;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;原创 2020-09-20 23:38:44 · 186 阅读 · 0 评论 -
自定义线程池
自定义线程池的逻辑图:步骤如下:1.首先定义BlockingQueue,实现生产者消费者模式,设置获取、添加任务的方法2.定义ThreadPool,设置核心数、池容量、阻塞队列对象、执行实体类等信息,实现execute方法3、测试。package 并发工具;import lombok.extern.slf4j.Slf4j;import java.util.ArrayDeque;import java.util.Deque;import java.util.HashSet;impor原创 2020-09-19 17:46:22 · 199 阅读 · 0 评论 -
享元模式--自定义数据库连接池
在String类和包装类大量使用了享元模式,就是使用Cache缓存了一部分数据而不是每次先创建元素或对象。自定义数据库连接池package 享元模式;import lombok.extern.slf4j.Slf4j;import java.sql.*;import java.util.Map;import java.util.Properties;import java.util.Random;import java.util.concurrent.Executor;import ja原创 2020-09-19 13:32:36 · 362 阅读 · 0 评论 -
多线程之ABA问题
1、ABA问题使用AtomicReference的变量在修改变量之前,感知不到其他线程对变量的修改。import lombok.extern.slf4j.Slf4j;import java.util.concurrent.atomic.AtomicReference;@Slf4jpublic class ABA问题 { static AtomicReference<String> ref = new AtomicReference<>("A"); pu原创 2020-09-17 21:43:17 · 970 阅读 · 0 评论 -
AtomicInteger基本使用
1、基本使用public class TestAtomic { public static void main(String[] args) { AtomicInteger i = new AtomicInteger(0); System.out.println(i.incrementAndGet()); //++i; System.out.println(i.getAndIncrement()); //i++; Sy原创 2020-09-11 23:10:56 · 403 阅读 · 0 评论 -
实现线程安全的对比:有锁、无锁
1、引出问题提出:编写代码,实现account.withdraw取款方法的线程安全2、代码实现import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;public class TestAccount { public static void main(String[] args) { AccountUnsafe accountUns原创 2020-09-11 18:29:42 · 255 阅读 · 0 评论 -
ReentrantLock实现锁重入
相比于synchronized它具备如下特点:锁可中断可以设置超时时间可以设置为公平锁支持多个条件变量与synchronized一样,都支持可重入。代码实现import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.ReentrantLock;@Slf4jpublic class Test22 { static final ReentrantLock lock = new ReentrantLo原创 2020-09-05 21:22:17 · 171 阅读 · 0 评论 -
java多线程:哲学家就餐问题
有五位哲学家,围坐在桌子旁他们只做两件事,思考和吃饭,思考一会儿吃口饭,吃完饭后接着思考。吃饭时要用两根筷子,桌子上共有5根筷子,每位哲学家左右手边各有一个根筷子如果筷子被身边的人拿着,自己就得等待代码实现import lombok.extern.slf4j.Slf4j;public class 哲学家就餐问题{ public static void main(String[] args) { Chopstick c1 = new Chopstick("1");原创 2020-09-05 18:24:15 · 343 阅读 · 0 评论 -
异步模式:生产者消费者模式
代码实现import lombok.extern.slf4j.Slf4j;import java.util.LinkedList;public class 生产者消费者模式 { public static void main(String[] args) { MessageQueue queue = new MessageQueue(2); for (int i = 0; i < 3; i++) { int id = i; .原创 2020-09-05 16:20:50 · 528 阅读 · 0 评论 -
多线程-设计模式-保护性暂停-解耦实现方式
图中Futures就好比居民楼一层的信箱(每个信箱有房间编号),左侧t0、t2、t4就好比等待邮件的居民,右侧的t1、t3、t5就好比邮递员如果需要在多个类之间使用GuardedObject对象,作为参数传递不是很方便,因此设计一个用来解耦的中间类,这样不仅能够解耦【结果等待着】和【结果生产者】,还能够同时支持多个任务处理import lombok.extern.slf4j.Slf4j;import java.util.Hashtable;import java.util.Map;import.原创 2020-09-04 22:37:48 · 465 阅读 · 0 评论 -
多线程设计模式 - 保护性暂停(有时限等待方式)
保护性暂停,即Guarded Suspension,用一个线程等待另一个线程的执行结果要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK中,join的实现、Futrue的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式代码实现import lombok.extern.slf4j.Slf4j;@Slf4jpublic class 保护性暂停 {原创 2020-09-04 22:27:18 · 717 阅读 · 1 评论 -
使用wait-notifyAll解决虚假唤醒问题
问题描述案例import lombok.extern.slf4j.Slf4j;@Slf4jpublic class 虚假唤醒问题 { private static final Object room = new Object(); private static boolean hasCigarette = false; private static boolean hasTakeOut = false; public static void main(Str原创 2020-09-01 23:28:35 · 494 阅读 · 0 评论 -
wait和notify使用API
wait和notify必须在获得锁之后才能使用,否则抛出异常import lombok.extern.slf4j.Slf4j;@Slf4jpublic class TestWaitAndNotify { static final Object lock = new Object(); public static void main(String[] args) throws InterruptedException { Thread t1 = new Threa.原创 2020-09-01 22:37:34 · 254 阅读 · 0 评论 -
使用多线程模拟卖票买票问题
模拟卖票和买票,测试代码是否会出现线程安全问题。import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;import java.util.List;import java.util.Vector;@Slf4jpublic class 买票卖票 { public static void main(String[] args) throws InterruptedException { TicketWin原创 2020-08-30 20:12:42 · 499 阅读 · 0 评论 -
局部变量是引用类型是否造成线程安全?
情形一:成员变量被多线程共享import java.util.ArrayList;import java.util.List;public class ThreadUnSafeTest { static final int THREAD_NUMBER = 2; static final int LOOP_NUMBER = 200; public static void main(String[] args) { //同一个对象被多个线程共享 final原创 2020-08-30 00:06:43 · 776 阅读 · 2 评论 -
线程共享所带来的问题
假设两个线程共享一个计数变量,线程1对计数变量自增5000,线程2对计数变量自减5000,最终的结果是0吗?不一定,会发生线程不安全问题。import lombok.extern.slf4j.Slf4j;@Slf4jpublic class Test共享问题 { private static int count = 0; public static void main(String[] args) throws InterruptedException { Th原创 2020-08-29 18:04:26 · 175 阅读 · 0 评论 -
java线程的六种状态
从Java API的角度查看线程的六种状态代码案例import lombok.extern.slf4j.Slf4j;@Slf4jpublic class TestState { public static void main(String[] args) { Thread t1 = new Thread("t1"){ @Override public void run() { log.debu原创 2020-08-29 17:31:38 · 166 阅读 · 0 评论