
java-多线程高并发基础
java-多线程高并发基础
帅到被人砍啊
发表的文章都是个人的小总结未必全对如果有疑问请大虾们多多指教啊
展开
-
kafka初体验
java开发kafka生产者以及消费者,并且对消费使用线程池处理。原创 2022-08-03 20:32:00 · 580 阅读 · 1 评论 -
CompletableFuture的一例使用
CompletableFuture提供了丰富的api,底层实现是ForkJoinPool。可以用来一个任务拆分成多个任务,最后将结果集汇总输出。比如说在网约车计费的情况下,其计算规则有很多种,按路程算钱,按时间算钱,路程又根据距离的远近计价不同,时间有可能根据时间点的不同以及等待的时间等规则计价,最后将各规则的价格汇总到一起形成个总价。模拟计价代码:public class MainTest { public static void main(String[] args) throw原创 2021-03-31 17:33:25 · 141 阅读 · 0 评论 -
ForkJoinPool
ForkJoinPool是一种可以将任务分发执行后将结果汇总起来的线程池。它与ThreadPoolExector线程池的不同在于,ThreadPoolExector多个线程共用一个任务队列,而ForkJoinPool是不同的线程使用不同的任务队列。如果有1000000个数,计算他们的和。如果一个线程跑,速度会比较慢,可以分成多个线程进行各自计算之后,把计算的和再汇总起来。import java.io.IOException;import java.util.Arrays;import java原创 2021-02-26 17:39:08 · 121 阅读 · 0 评论 -
ThreadPoolExecutor线程池及参数介绍
线程池类图如下:使用Executors工具类创建的线程池,都是创建的ThreadPoolExecutor对象。这个对象的核心参数有7个:1、corePoolSize 核心线程数,即便线程空闲也会一直在线程池中的线程数,除非设置允许核心线程超时的参数。2、maximumPoolSize 最大线程数 ,线程池中允许的最大线程,包含核心线程数3、keepAliveTime 非核心线程空闲等待时间,超过这个时间没有任务的话,非核心线程会被从线程池中销毁。4、TimeUnit keepAliv原创 2021-02-26 14:56:09 · 520 阅读 · 0 评论 -
交替输出A1B2C3D4...
定义两个线程,一个输出ABCD,一个输出1234,但是要求最终结果交替输出A1B2C3D4....这貌似是个面试题,尝试写了下,方法应该很多,但不是太容易。介绍两种写法:/** * 使用LockSupport交替输出A1B2C3.... */public class ByteNumber { static Thread t1 = null; static Thread t2 = null; public static void main(String[] args原创 2021-02-24 15:02:10 · 1673 阅读 · 0 评论 -
lock.lock()和lock.lockInterruptibly()的区别
一开始容易搞混两者的区别,看官方的说明看的也有点晕晕的。通过实验了几次,终于明白了,其实两者的区别就一句话:lock.lock()和lock.lockInterruptibly()在等待获取锁的时候,线程的interrupt()无法打断lock.lock(),但是可以打断lock.lockInterruptibly()。这句话有个非常重要的场景,就是这俩方法都是在等待获取锁的时候,才会有被打断一说。如果他们执行的时候已经直接获取到锁,是直接返回了。即便线程再次打断,也没法打断。除非线程执行打断的时.原创 2021-02-10 11:26:32 · 1889 阅读 · 0 评论 -
CAS
CompareAndSet/CompareAndSwap比较并交换,是一种乐观锁。Unsafe这个类提供的能力,从原语上支持了原子性。jdk1.8是不支持直接使用Unsafe的,通过反射可以获取到unsafe对象。public class TestCas { public static void main(String[] args) throws Exception { Field f = Unsafe.class.getDeclaredField("theUnsaf原创 2021-02-04 15:17:46 · 90 阅读 · 0 评论 -
死锁
所谓死锁,就是两个线程互相等待对方释放锁,即A持有B要获取的锁,B持有A要获取的锁,然后B要获取A持有的锁,A要获取B持有的锁。所以死锁至少有两把锁,对于只有一把锁的情况,不会出现死锁,只是锁等待。模拟下死锁,示例代码:public class DeadLock { static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] arg原创 2021-02-02 18:06:55 · 196 阅读 · 1 评论 -
线程的状态
线程总共有6中状态:New、Runnable、Block、Waiting、Timed Waiting、Terminated对于Runnable状态来讲,有两个内部的状态:Ready、Running具体流转图:原创 2021-02-02 17:44:26 · 77 阅读 · 0 评论 -
线程的创建方法
以下不论哪一种方法,归根结底就是一种,就是new Thread()。1、继承Thread类,调start方法public class MainThread { public static void main(String[] args) { new MyThread().start(); }}class MyThread extends Thread { @Override public void run() { System.原创 2021-02-02 15:38:04 · 105 阅读 · 0 评论