多线程
文章平均质量分 52
静谧之心
专业摩的佬
业余吉他手
退役喷子
展开
-
每期一个小窍门: java线程池的几种任务拒绝策略
当线程都满了,且队列也满了的情况下,会调用该方法来拒绝任务,有多种策略可以选择,或者自定义实现原创 2022-12-05 17:55:12 · 6241 阅读 · 1 评论 -
什么是指针回拨? 优化snowflake指针回拨的缺陷(不引入任何第三方中间件(redis, zk))
首先简单了解下, 什么是指针回拨?很多普遍的唯一ID算法, 例如雪花算法, 他们算法是根据本机的机器码, 还有本机时间得出的, 他们对本机的时间是强依赖的.服务器的硬件时钟的时间存在误差, 需要例如ntp服务来进行的自我校准,在回拨的期间, 这段时间是已经被ID生成算法使用过的, 也就变成了二手时间, 这个二手时间, 可能导致了我们再次计算ID时, 我们的参数因子都是相同的, 最终导致了生成完全重复的ID.那么怎么避免呢?等待这个二手时间过去(因为回拨时间大概率不会太长)侦测二手时间段,原创 2021-04-19 15:55:26 · 5187 阅读 · 3 评论 -
压测工具 wrk 和 jmeter对比
适用场景:Jmeter适合一些企业级的应用,逻辑复杂,但对并发的要求不是很高。多线程模型,支持集群。碰到了不少bug, 有点坑.wrk, 轻量级, 可以在服务器部署, 不占资源, 很少的性能能够占用可以大量并发, 适合一些互联网型的业务,高并发、高可用、逻辑相对简单的业务,合微服务、api等。多路io复用模型。 还不错正在使用.工具单机性能并发能力运行平台扩展能力上下文能力其他jmeter弱所有平台js/beanshell/插件/jar强报表、监控wrk原创 2020-11-12 09:48:54 · 1619 阅读 · 3 评论 -
Springboot @Async 配合 @PostConstruct 实现启动时自动执行异步任务
最近有个需求是需要在springboot启动时启动个异步任务, 上网找了好久, 发现@Async 标注异步方法, 还有@@PostConstruct 可以让该方法启动时运行, 随即有了此篇.@PostConstruct注解@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器原创 2020-08-19 17:46:46 · 7121 阅读 · 2 评论 -
硬核讲解JDK1.8的ConcurrentHashMap为何放弃分段锁改用CAS + synchronized
jdk1.7分段锁的实现和hashmap一样,在jdk1.7中ConcurrentHashMap的底层数据结构是数组加链表。和hashmap不同的是ConcurrentHashMap中存放的数据是一段段的,即由多个Segment(段)组成的。每个Segment中都有着类似于数组加链表的结构。关于SegmentConcurrentHashMap有3个参数:initialCapacity:初...原创 2020-04-15 04:21:03 · 39544 阅读 · 13 评论 -
ConcurrentHashMap为什么比HashTable性能好?
ConcurrentHashMap为什么比HashTable性能好?答:ConcurrentHashMap里使用了Segment分段锁+HashEntry,而HashTable用的是Syncronized锁全部,所有线程竞争一把锁。Segment分段锁继承ReentrantLock,在并发数高的时候,ReentrantLock比Syncronized总体开销要小一些。参考 :https://...原创 2020-04-15 03:08:38 · 1090 阅读 · 0 评论 -
ThreadLocal内存泄漏问题
一、概述ThreadLocal类用来提供线程内部的局部变量。这些变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型。 总结:ThreadLocal不是为了解决多线程访问共享变量,而是为每个线程创建一个单独的变量副本,提供了保持对象的方法和避免参数传递的复杂性。Thread...原创 2020-04-09 08:29:37 · 451 阅读 · 0 评论 -
自己实现ThreadLocal源码!
package com.bestksl.example.threadlocal;import java.util.HashMap;import java.util.concurrent.atomic.AtomicInteger;public class MyThreadLocal<T> { static HashMap<Thread, HashMap<In...原创 2020-04-08 16:38:53 · 410 阅读 · 0 评论 -
为什么序列化会破坏单例?
转自 HollisChuang’s Blog: http://www.hollischuang.com/archives/1144本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。但是,单例模式真的能够实现实例的唯一性吗?答案是否定的,很多人都知道使用反射可以破坏单例模式,除了反射以外,使用序列化与反序列化也同样会破坏单例。序列化对单...原创 2020-04-07 07:36:27 · 1019 阅读 · 1 评论 -
枚举来实现单例为什么大牛都这么推荐?
哪种写单例的方式最好?在StakcOverflow中,What is an efficient way to implement a singleton pattern in Java?有一个关于的讨论:如上图,得票率最高的回答是:使用枚举。回答者引用了Joshua Bloch大神在《Effective Java》中明确表达过的观点:使用枚举实现单例的方法虽然还没有广泛采用,但是单元素的...原创 2020-04-07 07:20:55 · 1198 阅读 · 2 评论 -
从DCL(双重检测锁)详解volatile禁止指令重排序
DCL(双重检查锁定)里发现的东西下面是使用 volatile 来优化双重检查锁定的代码:public class SafeDoubleCheckedLocking { private volatile static Instance instance; public static Instance getInstance() { if (instance == null) { ...原创 2020-04-07 06:34:45 · 761 阅读 · 0 评论 -
Java 枚举实现的单实例是否属于饿汉模式单实例?
枚举里的值确实都相当于final static修饰的变量,和饿汉很相似,但他实际暴露出去的单例变量却不是在启动时就初始化的(你可以debug感受一下),这一点和懒汉很像,因此把枚举实现的单例归为懒汉和饿汉都不ok。...原创 2020-04-07 05:39:51 · 858 阅读 · 0 评论 -
Java内存模型(JMM) happens-before原则详解
在JMM(JAVA内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happensbefore关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。happens-b...原创 2020-04-06 13:15:07 · 882 阅读 · 0 评论 -
JMM的CAS机制和带来的ABA问题
CASCAS全称是CompareAndSwap,是一条CPU的原子指令,其作用是让CPU经过比较后原子地更新某个位置的值,CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了封装汇编的接口。我们知道synchronized是一种悲观锁,它使得其它需要锁的线程挂起,等待持有锁的线程释放锁。而乐观锁却不加锁,它假设没有冲突去完成某项操作,如果冲突失败就重试,直...原创 2020-04-06 12:43:23 · 1115 阅读 · 0 评论 -
JUC 中的 Atomic 原子类总结
首先附上csdn大佬 Guide哥 的思维导图, 这篇文章也是借鉴他的Atomic 原子包介绍并发包 java.util.concurrent 的原子类都存放在java.util.concurrent.atomic下,如下图所示。根据操作的数据类型,可以将JUC包中的原子类分为4类基本类型使用原子的方式更新基本类型AtomicInteger:整形原子类AtomicLong:长整...原创 2020-04-05 12:18:40 · 233 阅读 · 0 评论 -
Java高并发系列之Java内存模型, 八种基本操作以及安全同步规则
先来看一下 CPU 的内存模型JVM内存模型java内存模型逻辑抽象图java 内存模型lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用lo...原创 2020-03-29 05:06:02 · 1616 阅读 · 0 评论 -
cpu乱序执行优化与多级缓存一致性MESI算法带来的后遗症
一、指令乱序执行对于CPU性能有以下公式处理器性能=主频∗IPC处理器性能 = 主频 *IPC处理器性能=主频∗IPC由上述公式我们可以知道,提高CPU性能要么就提高主频,要么就提高IPC(每周期执行的指令数).提升IPC有两种做法,一个是增加单核并行的度,一个是加多几个核~单核CPU增加并行度的主要方式是采用流水线设计。早期一些采用非常简单的指令集的电脑是采用单周期设计的,取指、解码、...原创 2020-03-27 11:48:37 · 1057 阅读 · 0 评论 -
多线程系列之 java信号量机制 Semaphore 详解
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。Semaphore...原创 2020-03-27 08:24:06 · 860 阅读 · 0 评论