java
快乐的码农一枚
这个作者很懒,什么都没留下…
展开
-
volatile使用场景
状态标记量volatile boolean flag = false; while(!flag){ doSomething();} public void setFlag() { flag = true;}double checkclass Singleton{ private volatile static Singleton instance = null; private Singleton() { .原创 2020-07-03 10:33:02 · 87 阅读 · 0 评论 -
HashMap1.8 改进
hash碰撞后,链表的顺序是后插入的在后面,1.8之前是后插入的在前面。会导致rehash的并发的时候进入死循环 hash碰撞后,链表可能会变成红黑树(有一个阀值) put的时候,先插入后扩容。因为有红黑树的变更,所以需要先插入 节点对象由Entry变成 Node(红黑树需要)...原创 2020-01-19 14:11:49 · 312 阅读 · 0 评论 -
支持键值相同的map结构
LinkedMultiValueMappublic class LinkedMultiValueMap<K, V> implements MultiValueMap<K, V>, Serializable, Cloneable { private static final long serialVersionUID = 3801124242820219131L; private final Map<K, List<V>> targetMa..原创 2020-06-03 10:27:00 · 169 阅读 · 0 评论 -
DirectByteBuffer 怎么回收内存
DirectByteBuffer 创建的时候,会调用cleaner = Cleaner.create(this, new Deallocator(base, size, cap)); 见下图倒数第二行DirectByteBuffer(int cap) { // package-private super(-1, 0, cap, cap); ...原创 2019-12-19 17:38:12 · 193 阅读 · 0 评论 -
文件流操作的性能优化历程
WritableByteChannel writableByteChannel = Channels.newChannel(zipOut)fileChannel.transferTo(0, FILE_SIZE, writableByteChannel);既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢?其实直接缓冲区有以下的缺点。直接缓冲区的缺点:1、不安全2、消耗更多,因为它不...原创 2022-04-08 20:12:55 · 362 阅读 · 0 评论 -
IdentityHashMap和HashMap的区别
IdentityHashMap是Map接口的实现。不同于HashMap的,这里采用参考平等。●在HashMap中如果两个元素是相等的,则key1.equals(key2)●在IdentityHashMap中如果两个元素是相等的,则key1 == key2源码如下 public V put(K key, V value) { final Object k = maskNull(key); retryAfterResize: for (;;) {.原创 2020-06-04 10:01:08 · 490 阅读 · 0 评论 -
ArrayList Iterator 删除为啥不会出现 ConcurrentModificationException
private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public boolean hasN..原创 2020-06-13 15:06:19 · 96 阅读 · 0 评论 -
ReentrantReadWriteLock实现读写锁
AQS中最有一个state字段来标识锁的占用情况,怎么分配给读、写两种锁呢 ===》 采用了state分段,前面16位给读锁使用;后面16位给写锁使用;不能越界获取读锁的逻辑代码protected final int tryAcquireShared(int unused) { /* * Walkthrough: * 1. If write lock held by another thread, fail. * 2. Otherwise, this thread is elig.原创 2020-07-03 12:14:13 · 109 阅读 · 0 评论 -
volatile 内存屏障
Load Barrier 和 Store Barrier即读屏障和写屏障内存屏障的作用:禁止指令重排序 强制将写缓冲区和高速缓存中的数据写回系统内存,让缓存中的数据失效对于Load Barrier来说,在指令前插入Load Barrier,可以让高速缓存中的数据失效,强制从新从主内存加载数据; 对于Store Barrier来说,在指令后插入Store Barrier,能让写入缓存中的最新数据更新写入主内存,让其他线程可见java的内存屏障 LoadLoad屏障:对于这样的语句L.原创 2020-07-02 20:52:03 · 445 阅读 · 0 评论 -
Executors弊端
Executors.newFixedThreadPool(1); // LinkedBlockingQueue 无界的队列 可能会导致内存溢出Executors.newCachedThreadPool(); // maximumPoolSize 使用了最大值,可能会导致内存溢出...原创 2019-12-13 14:08:06 · 257 阅读 · 0 评论 -
tomcat优化jdk原生的线程池
为啥要优化 1、由于tomcat 处理的都是一些网络方面的线程任务,都是IO类型的2、JDK原生线程池,当核心线程满了之后往队列里面存放,这样不符合web容器的任务3、tomcat修改为,核心线程满了之后,再创建非核心线程。最后再往队列任务里面存放 优化的手段 public void execute(Runnable command) { if (comm...原创 2020-01-15 17:11:11 · 456 阅读 · 0 评论 -
线程池的queue
LinkedBlockingQueue 采用的是lock进行同步操作,分为put锁 take锁#默认是无界的,资源容易失控#但是可以建立的时候指定容量,capacitypublic void put(E e) throws InterruptedException { if (e == null) throw new NullPointerException()...原创 2020-04-20 10:47:29 · 422 阅读 · 0 评论 -
线程池动态修改核心线程数
通过线程池的方法重新设置核心线程数setCorePoolSize当最新的核心线程数小于之前的核心线程数时,则需要进行多余的线程中断当最新的核心线程数大于之前的核心线程数,则需要逐步的增加核心线程数源码如下: public void setCorePoolSize(int corePoolSize) { if (corePoolSize < 0) throw new IllegalArgumentException(); int.原创 2020-05-29 14:00:28 · 2391 阅读 · 0 评论 -
synchronized锁升级
偏向锁、轻量级锁、重量级锁锁升级的过程偏向锁 是单线程运行时会置锁为偏向锁轻量级锁,多线程并发的时候,就是displace make word 线程并非本线程,代表有竞争,这时候锁升级为轻量级锁重量级锁,就是多线程并发置换make word时,没有成功,又自旋置换,如果自旋还未成功,代表竞争已经非常激烈了必须升级为重量级锁...原创 2019-12-24 10:02:06 · 98 阅读 · 0 评论 -
ReentrantLock
区分公平锁和非公平锁 默认非公平锁 // 不公平的,是需要lock刚开始去抢锁一次 final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); ...原创 2020-01-16 15:18:54 · 157 阅读 · 0 评论 -
StampedLock 比读写锁还要灵活、还要快的锁
import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.StampedLock;/** * Created by li.ma on 2020/4/8. */public class StampedLockDemo { public static void main(String[] args) { StampedLock stampedLock = new StampedLock();.原创 2020-06-02 17:55:39 · 98 阅读 · 0 评论 -
BufferedImage Font 乱码
Font titleFont = new Font("宋体", Font.PLAIN, 50); 如果linux服务器上面缺少宋体的字体,则会乱码需要将win系统字体文件(系统路径:C:\Windows\Fonts) 上传到linux服务器对应的jre字体目录中去/usr/local/java/jdk1.8.0_181/jre/lib/fonts上传完成之后,一定重启java服务器...原创 2020-09-11 13:13:09 · 1013 阅读 · 1 评论 -
查看类属于哪个架包,解决架包冲突
try{ JSON.parseObject("..."); // 这个可用换成你想知道的类出处的方法 }catch(Throwable e){ String loc = ""; String urlLoc = ""; try { loc =Feature.class.getProtectionDomain().getCodeSource().getLocation().getFile(); urlLoc =..原创 2020-11-07 10:49:27 · 195 阅读 · 0 评论 -
HashMap按value顺序排序
public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("java", 4); map.put("C++", 2); map.put("C#", 22); map.put("python", 12); map.put("scala", 1); ..原创 2020-06-28 22:05:02 · 485 阅读 · 0 评论 -
ConcurrentHashMap 一些锁事
1.8版本比之前版本的优化之处 1、存储元素的节点类型由Entry 变成 Node(多了next指针) 有利于链表改成树存储2、取消Segment, 由CAS + synchronized来解决并发问题3、另外,在其他方面也有一些小的改进,比如新增字段 transient volatile CounterCell[] counterCells; 可方便的计算hashmap中所有元素的个数,性能大大优于jdk1.7中的size()方法(遍历segment数组进行计数) put .原创 2020-06-11 11:08:57 · 154 阅读 · 0 评论 -
arthas 用法
java -jar arthas-boot.jar 启动 选择需要监控的pid编号 dashboard可以查看线程,内存,GC,以及Runtime信息 ID NAME GROUP PRIORITY STATE ...原创 2020-06-05 14:40:07 · 660 阅读 · 0 评论 -
线程中断的方法
interrupt()方法仅仅是通知线程,线程有机会执行一些后续操作,同时也可以无视这个通知。被interrupt的线程,有两种方式接收通知:一种是异常, 另一种是主动检测。通过异常接收通知当线程A处于WAITING、 TIMED_WAITING状态时, 如果其他线程调用线程A的interrupt()方法,则会使线程A返回到RUNNABLE状态,同时线程A的代码会触发InterruptedException异常。线程转换到WAITING、TIMED_WAITING状态的触发条件,都是调用了类似wai原创 2020-06-04 18:02:32 · 105 阅读 · 0 评论 -
synchronized 锁升级之后,怎么降级
synchronized java规定锁升级之后,则无法锁降级;升级之后,如果系统的并发下来了,无疑降低了处理速度我们可以进行一段时间进行统计,统计并发度已经很低,如果还是重量级锁,则进行锁对象的切换。换一个锁对象,这样又开始偏向锁状态,提升了处理速度;锁对象切换时候,需要注意并发操作;怎么获取当前锁对象是否处于重量级锁状态 <dependency> <groupId>org.openjdk.jol</groupId> .原创 2020-05-21 17:26:25 · 3747 阅读 · 2 评论 -
强引用和弱引用jvm回收区别
强引用回收的步骤 1、判断是否有必要执行finalize方法 下面两种情况没有必要执行了 a)对象没有重写finalize方法 b)finalize方法已经被虚拟机调用过了2、如果上述条件判断出,是需要执行finalize方法的;那么此对象将会放置在一个叫做 F-Queue的队列中,并由虚拟机自建的Finalizer线程去执行它(此线程低优先级)3、是被回收还是逃...原创 2020-01-15 13:04:41 · 336 阅读 · 0 评论 -
JAVA题目
说一下springboot的启动过程?平时开发中都用哪些注解?遇到过redis的hotkey吗kafka的原理?怎么保证消息不丢失?Jedis 与 Redisson 对比有什么优缺点?5.JVM面试题1、JVM三大性能调优参数,JVM 几个重要的参数2、JVM调优3、JVM内存管理,JVM的常见的垃圾收集器,G1垃圾收集器。GC调优,Minor GC ,Full GC 触发...原创 2019-12-30 13:56:04 · 91 阅读 · 0 评论