![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
高并发多线程
文章平均质量分 55
技术砖家--Felix
I'm felix li
展开
-
《雪花算法》的介绍以及实现
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的SnowFlake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。原理Twitter的雪花算法SnowFlake,使用Java原创 2022-03-22 17:54:25 · 350 阅读 · 0 评论 -
并行流parallel,CompletableFuture与Executors线程池的使用与区别
List并行操作在项目开发可以极大提高代码效率与性能,java8对其进行了很好的封装,简单使用研究一下:1. 先自己创建一个list:// list在实际使用中要注意线程安全,Collections.synchronizedList写操作性能高,CopyOnWriteArrayList读操作性能较好List list = Arrays.asList(new String[10000]);2. parallel并行流使用:list.stream().parallel().forEach(a ->转载 2021-12-18 16:02:34 · 481 阅读 · 0 评论 -
CopyOnWriteArrayList分析
CopyOnWriteArrayList转载 2021-09-28 11:47:06 · 63 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁详解
ReentrantReadWriteLock读写锁详解转载 2021-09-28 11:39:11 · 69 阅读 · 0 评论 -
JUC之Fork/Join使用详解
Fork/JoinFork/Join并行方式是获取良好的并行计算性能的一种最简单同时也是最有效的设计技术。Fork/Join并行算法是我们所熟悉的分治算法的并行版本,典型的用法如下:Result solve(Problem problem) { if (problem is small) { directly solve problem } else { split problem into independent parts fo..原创 2021-08-09 15:55:37 · 357 阅读 · 0 评论 -
Lock和Synchronized的对比和实现
Lock拥有锁获取与释放的可操作性、可中断的获取锁以及超时获取锁Lock lock = new ReentrantLock(); lock.lock(); try { // ..} finally { lock.unlock();}注意:在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,会提前进行unlock导致IllegalMonitorSt原创 2021-08-05 15:16:55 · 226 阅读 · 0 评论 -
ThreadLocal 无法解决共享对象和ThreadLocalMap弱引用问题
ThreadLocal 无法解决共享对象的更新问题ThreadLocal 对象建议使用 static修饰。这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,所有此类实例共享 此静态变量 ,也就是说在类第一次被使用时装载,只分配一块存储空间,所有此类的对象(只 要是这个线程内定义的)都可以操控这个变量。关于ThreadLocalMap<ThreadLocal, Object>弱引用问题:当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocal原创 2021-07-01 19:31:43 · 903 阅读 · 0 评论 -
笔试算法《多线程》
题目问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。[注:C语言选手可使用WINDOWS SDK库函数]接口说明:void init(); //初始化函数void Release(); //资源释放函数unsignedint__stdcall ThreadFun1(PVOID pM) ; //线原创 2021-06-30 23:32:01 · 217 阅读 · 2 评论 -
Java并发之CountDownLatch
创建方式 //5为计数值 private static CountDownLatch countDownLatch = new CountDownLatch(5);使用public class CountDownLatchUserCase { private static CountDownLatch countDownLatch = new CountDownLatch(5); public static void main(String[] args) thr原创 2021-06-25 10:33:48 · 91 阅读 · 0 评论 -
Java并发之Condition
创建方式 public Lock lock = new ReentrantLock(); public Condition condition = lock.newCondition();配合lock锁使用public class ConditionUseCase { public Lock lock = new ReentrantLock(); public Condition condition = lock.newCondition(); publi原创 2021-06-25 10:21:57 · 86 阅读 · 0 评论 -
从源码分析ConcurrentHashMap如何实现线程安全的?
concurrentHashMap如何实现线程安全的?转载 2021-06-10 17:32:56 · 89 阅读 · 0 评论 -
关于集合list,map,set的几个问题解答!
1.list和set、map区别是什么,他们分别使用在什么场合?底层: linkedList的底层结构实现是利用对象Node,包含pre(上一个节点),next(下一个节点)和item(存储数据内容)实现,是一个双向链表;Linkedlist的删除和插入要比ArrayList快,只需要移动指针即可。ArrayList和LinkedList底层实现的区别 private static class Node<E> { E item; Node<原创 2021-06-10 09:47:04 · 166 阅读 · 0 评论 -
关于Java线程池的几个问题?
1. 线程池相关核心线程满了线程放哪里?阻塞队列满了放哪里?基本线程和阻塞队列都满了放哪里?核心参数:int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。 intmaximumPoolSize, // 线程数的上限 long keepAliveTime, TimeUnit unit, //超过corePoolSize的线程的idle时长,超过这个时间,多余的线程会被回收。 BlockingQueueworkQueue, // 任务的排队队原创 2021-06-09 09:35:58 · 455 阅读 · 3 评论 -
HashMap和ConcurrentHashMap的扩容过程详解
1. HashMap的扩容过程首先判断扩容,插入数据后,如果容量大于threshold(容量*负载因子),则进行扩容;获取当前容量,若当前容量大于0,并且大于MAXIMUM_CAPACITY = 1 << 30,则不进行扩容,将 threshold = Integer.MAX_VALUE进行赋值。否则创建新的数组,将容量进行两倍扩大,threshold也进行两倍扩容,下面截取部分源码; if (oldCap > 0) { if (oldCap原创 2021-06-04 15:26:27 · 1787 阅读 · 1 评论 -
ConcurrentHashMap1.8 - 扩容详解
ConcurrentHashMap1.8 - 扩容详解转载 2021-06-04 15:22:44 · 226 阅读 · 0 评论 -
利用swing写了一个随机点名小程序,超级实用!!!
利用swing做一个随机点名的小程序,可以添加姓名后点击查找,有一个查找的动态过程渲染的过程,最后停留在随机找到的那个人的框里代码mport javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import java.util.List;import java.util.Random;原创 2021-05-27 15:44:44 · 919 阅读 · 1 评论 -
scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别
总结:scheduleAtFixedRate ,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。scheduleWithFixedDelay,是以上一个任务结束时开始计时,period时间过去后,立即执行。重点:两个方法以不同的时间点作为参考。例子:package com.yuankai.t1.thread;import java.util.concu转载 2021-05-18 15:27:29 · 389 阅读 · 1 评论 -
Thread.yield( )方法详解
Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!...原创 2020-07-31 13:17:30 · 6739 阅读 · 0 评论 -
Java几种线程池的核心线程数和最大线程数详解
摘自:Java线程池的核心线程数和最大线程数总是容易混淆怎么办转载 2020-07-23 13:21:55 · 4002 阅读 · 0 评论 -
多线程-线程interrupt和stop方法
对于线程终止,一般比较少的用到,那是因为线程执行完毕就会结束,但是有些情况下,有些后台线程会长时间在系统中运行,不会正常终结,本身就长期提供某个服务,那么如何关闭线程,就需要一种手段,在java中我们如何关闭线程呢?线程停止方法stop()先看源码:@Deprecated public final void stop() { SecurityManager sec...原创 2019-10-20 16:19:00 · 689 阅读 · 3 评论 -
leetcode(多线程)-按序打印-CountDownLatch方法
我们提供了一个类:public class Foo { public void one() { print("one"); } public void two() { print("two"); } public void three() { print("three"); }}三个不同的线程将会共用一个 Foo 实例。线程 A 将会调用 one() 方法线程 B 将会调用...原创 2019-10-18 15:19:03 · 571 阅读 · 0 评论 -
Java串行和并发比较,多线程是否一定快?
上下文切换单核处理器也能实现上下文切换,CPU通过给每个现场分配CPU时间片来实现这个机制,时间片是CPU分配给各个线程的时间,时间片非常短,CPU通过不停的切换线程执行,并且保存上一个任务的状态,感觉是同时执行的,关于时间片操作系统中有详细的讲解。多线程是否一定的快?下面通过代码演示:/** * @author LiHaitao * @description Concurrenc...原创 2019-09-29 10:45:05 · 767 阅读 · 4 评论 -
Java多线程Join方法
join方法,把指定线程加入到当前线程,并且当指定线程执行完才继续执行当前线程。例如。thread1,thread2。在thread2中thread1.join(),那么thread1执行完,thread2再继续执行。join()方法源码:public final void join() throws InterruptedException {join(0);}案例:...原创 2019-10-11 13:17:25 · 188 阅读 · 0 评论 -
Cas算法
1,悲观锁和乐观锁:悲观锁:总是假设最坏的情况,认为竞争总是存在,每次拿数据的时候都认为会被修改,因此每次都会先上锁。其他线程阻塞等待释放锁。乐观锁:总是假设最好的情况,认为竞争总是不存在,每次拿数据的时候都认为不会被修改,因此不会先上锁,在最后更新的时候比较数据有无更新,可通过版本号或CAS实现。2,使用场景:悲观锁:用于写比较多的情况,避免了乐观锁不断重试从而降低性能乐观锁: 用于...原创 2019-10-11 13:20:50 · 536 阅读 · 1 评论 -
资源限制问题
1,什么事资源限制?资源限制是在并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。2,资源限制引发的问题?在并发编程中,将代码执行速度加快的原则就是将串行部分变成并发执行,但是如果将某段串行执行的代码编程并发执行,因为受限于资源问题,仍然在串行执行,这时候程序不但不会加快,反而会变慢,这是因为增加了上下文切换和资源调度的时间。3,如何解决资源限制的问题?对于硬件资源可以考虑使用...原创 2019-10-11 13:27:28 · 833 阅读 · 0 评论 -
synchronized和volatile
volatile:synchronized和volatile都扮演着重要的角色。volatile是轻量级的synchronized,他在处理并发中保证了共享变量的可见性,可见性的意思是一个线程修改这个变量的时候另一个线程可以读到这个修改的值,如果volatile修饰恰当的话,他比synchronized执行成本更低,因为他不会引起上下文切换和调度资源。synchronized:synch...原创 2019-10-11 13:32:07 · 129 阅读 · 0 评论 -
Java利用Cas原理实现原子操作
Java实现原子性:1,使用循环CAS实现原子操作:JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路是循环进行CAS操作直到成功。/** * @author LiHaitao * @description Counter:Cas实现原子操作 * @date 2019/9/24 16:40 **/public class Counter...原创 2019-10-11 13:34:01 · 416 阅读 · 0 评论 -
Java死锁
死锁:相互等待对方释放资源/** * @author LiHaitao * @description DeadLockDemo:死锁 * @date 2019/9/23 15:26 **/public class DeadLockDemo { private static String A = "A"; private static String B = "B";...原创 2019-10-11 13:36:30 · 95 阅读 · 0 评论 -
notify()和notifyAll()方法的区别
/** * @author LiHaitao * @description Th: * @date 2019/1/28 15:30 **/import java.util.logging.Level;import java.util.logging.Logger;/** * Java程序演示如何在Java和Java中使用notify和notifyAll方法 *如何通知和no...翻译 2019-01-28 15:51:58 · 1359 阅读 · 0 评论