java
Gavin-Ng
潜修中,攻克java微服务和大数据
展开
-
乐观锁和悲观锁解决leetcode的1117题目H2O生成问题
使用乐观锁+Thread.yield实现package com.gavin;import org.junit.jupiter.api.Test;import java.util.concurrent.Semaphore;public class LockTest { private static final String strs = "HHOOHHOHOHHH"; private volatile int hNum = 0; @Test public voi原创 2021-06-27 23:57:37 · 109 阅读 · 1 评论 -
Condition和Semaphore以及Blockingqueue实现打印零与奇偶数
import org.junit.jupiter.api.Test;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class MyTest { private ReentrantLock lock = new ReentrantLock();原创 2021-06-25 22:09:45 · 88 阅读 · 0 评论 -
4核8g的机器最快速度求字符串中字符出现次数最少的(线程安全问题排查和解决)
第一个版本(会有线程安全问题) StringBuilder str = new StringBuilder("dsakljdkluqioweknm,weqn,bqj,rrwq,mnkkwqjekljqwklejqwklwq,em,qwbmnbqwmnrbqwnmbrwqsadsadadgjklg"); str = new StringBuilder("uyuiyijkljkx,m,ccgeuioqejbnmewbmrnbwekjhjjxcv,m654876q123e123132456a4q8原创 2021-06-16 23:57:43 · 208 阅读 · 0 评论 -
java实现跳表
1.跳表的定义跳表(SkipList):增加了向前指针的链表叫做指针。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质是一种可以进行二分查找的有序链表。跳表在原有的有序链表上增加了多级索引,通过索引来实现快速查询。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。跳表是一个随机化的数据结构,可以被看做二叉树的一个变种,它在性能上和红黑树、AVL树不相上下,但是跳表的原理非常简单,目前在Redis和LevelDB中都有用到2.跳表的详解对于一个单链表来说,即使链表中的数据是原创 2021-06-16 18:48:22 · 219 阅读 · 0 评论 -
给数字n,一个线程负责打印奇数,另外两个线程负责交替 打印偶数,要求顺序打印
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class LockTest { private static volatile int curNum = 1; private static int n = 10; ReentrantLock lock = new ReentrantLock();//奇数和偶数的锁 Co原创 2021-06-15 23:39:24 · 128 阅读 · 0 评论 -
ReenTranLock底层原理
ReenTranLock底层原理ReenTranLock是一种可重入锁,比synchronized方便是因为内部还有condition可以将锁进行分离唤醒,内部提供lock和unlock这两个核心方法lock调用的是sync中lock方法,在公平和非公平下有各自实现公平模式的lock方法:直接调用acquiredfinal void lock() { acquire(1);}公平模式重写tryAcquire方法 protected final boolean t原创 2021-06-13 17:11:06 · 268 阅读 · 0 评论 -
java反射的底层原理,机制,优点和缺点
java反射的底层原理,机制,优点和缺点(1).什么是反射java反射机制核心是在程序运行时动态加载类对象并获取类的信息,本质是jvm获得class对象后,再通过对象反编译,获取对象各种信息,普通获取对象的方式是通过编译生成.class文件,jvm再加载.class文件获取类的信息,在jvm中生成一个对象(2)反射优点<1>可通过配置文件动态加载所需要的的类,而不需要在编译前去new一个对象,对项目进行了解耦<2>可以通过反射访问java的方法,属性,包括私有的(需要set原创 2021-06-13 16:06:21 · 612 阅读 · 0 评论 -
CLH队列cas自旋锁实现
CLH队列CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁。结点之间是通过隐形的链表相连,之所以叫隐形的链表是因为这些结点之间没有明显的next指针,而是通过myPred所指向的结点的变化情况来影响myNode的行为。CLHLock上还有一个尾指针,始终指向队列的最后一个结点当一个线程需要获取锁时,会创建一个新的QNode,将其中的locked设置为true表示需要获取锁,然后线程对tail域调用getAndSet方原创 2021-06-13 15:58:17 · 119 阅读 · 0 评论 -
Semaphore底层原理
Semaphore底层原理Semaphore就是多个线程同时跑直到state变为0则阻塞等待唤醒Semaphore对外提供两个核心方法,一个是acquire,一个是release,内部继承了AQS的框架,实现了公平模式和非公平模式acquire都会调用AQS中公共的acqureSharedInterruptibly public final void acquireSharedInterruptibly(int arg) throws InterruptedExce原创 2021-06-13 15:48:11 · 294 阅读 · 0 评论 -
ThreadPool底层原理
ThreadPool底层原理线程池的好处:实现线程的复用,Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。线程池各个参数介绍corePoolSize线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize,如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行,如果执行了线程池Th原创 2021-06-12 23:03:06 · 195 阅读 · 0 评论 -
CountDownLauch底层原理实现
1.基于Aqs框架,内部声明静态内部类Syns继承AbstractQueuedSynchronizer,重写了tryAcquireShared和tryReleaseShared方法![在这里插入图片描述](https://img-blog.csdnimg.cn/202.两个主要方法await和countDownawait调用Aqs的acquireSharedInterruptibly自带方法(可中断,向上抛出中断异常),内部调用tryAcquireShared和doAcquireSharedInter原创 2021-06-10 01:17:33 · 427 阅读 · 0 评论