
java
文章平均质量分 79
是小白哇
因为无知、所以追逐
展开
-
ConcurrentHashMap源码分析
final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); //获取key的hash值 int hash = spread(key.hashCode()); int binCount...原创 2020-04-12 13:59:55 · 943 阅读 · 0 评论 -
Random和ThreadLocalRandom原理分析
Random和ThreadLocalRandom原理分析原创 2020-04-02 01:01:55 · 965 阅读 · 0 评论 -
VM.getSavedProperty和System.getProperty区别
VM.getSavedProperty和System.getProperty区别原创 2020-04-01 20:19:36 · 1845 阅读 · 3 评论 -
idea打包可执行的jar与Error: Invalid or corrupt jarfile问题
build前的设置1、在菜单中选择 File->project structure2、选择Artifacts,点击"+",选择jar -> from modules with dependencies3、选择执行主类。执行jar的之后,就会从这个类中的main函数开始执行4、选择执行主类之后,idea会自动默认填充META-INF/MANIFEST.MF目录,这个自动默认...原创 2020-04-01 14:50:32 · 17614 阅读 · 4 评论 -
Semaphore源码分析
Semaphore通常用于在程序中做限流使用,控制一段程序同时只能有n个线程同时访问。既然是同时有多个线程能同时访问,那Semaphore是用的肯定就是共享锁。其原理就是有线程获取了锁,就对state减,释放锁后就对state加。state小于0的时候,就对线程阻塞。一旦释放了锁,就唤醒等待线程。Semaphore是通过共享锁实现的,如果对ReentrantReadWriteLock不熟悉的,...原创 2020-03-29 17:39:24 · 668 阅读 · 0 评论 -
CountDownLatch源码分析
CountDownLatch的作用,就是将多个线程阻塞,等待某一事件触发后,再同时将阻塞的多个线程放行。如果你对ReentrantLock,ReentrantReadWriteLock足够了解的话,通过CountDownLatch的功能,不难想到,CountDownLatch要阻塞多个线程并做到同时放行,所以他的await肯定是使用的共享锁进行阻塞。而创建CountDownLatch的时候,指定...原创 2020-03-29 16:24:07 · 596 阅读 · 0 评论 -
ReentrantReadWriteLock源码分析
public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcquireShared(arg); }protected final int tryAcquireShared(int unused) { /* * Walkthrough: ...原创 2020-03-29 13:17:56 · 645 阅读 · 0 评论 -
ReentrantLock Condition源码分析
Condition.awaitpublic final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); //将当前线程封装为Node节点加入到wait队列中 Node node = addCondit...原创 2020-03-28 23:57:06 · 694 阅读 · 0 评论 -
ReentrantLock源码分析
ReentrantLock实现源码分析原创 2020-03-28 00:02:13 · 1130 阅读 · 1 评论 -
Thread.yield原理分析
Thread.yield()方法的作用是暂时放弃当前线程对CPU的占用权,将它让给其它线程。他是如何实现的呢?通过看yield源码,发现其是本地方法,找到其在JVM中的源码实现如下:JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass)) JVMWrapper("JVM_Yield"); //判断操作系统是否允许使用Yield...原创 2020-02-24 00:49:30 · 1762 阅读 · 0 评论 -
Thread.join()方法原理分析
如果现在有这样一个场景:在主线程中创建两个线程T1和T2,通过start启动线程后。我们想T1结束了再执行T2,等T1和T2都执行结束,才继续执行主线程,怎么能做到呢?其实很简单,通过join就可以实现:public class JoinDemo { private static int count = 0; public static void main(String[] a...原创 2020-02-23 23:59:19 · 779 阅读 · 0 评论 -
Volatile全面解析,实现原理及作用分析
在java中,volatile有两个作用,一个是禁止指令重排序(编译时指令重排序 和 CPU乱序执行)。另一个是保证多线程共享变量的可见性。为了讲解volatile时如何禁止指令重排序,防止CPU乱序执行,以及保证变量内存可见性。首先我们需要了解这些概念,即什么是编译时指令重排序?为什么要指令重排序?为什么CPU会乱序执行?什么事内存可见性?之后,再来看volatile做了什么。1 编译时指令重...原创 2020-02-23 19:37:06 · 3265 阅读 · 5 评论 -
Wait与notify/notifyAll源码分析
要理解看懂下面讲解的Wait和notify/notifyAll实现原理,首先要弄明白synchronized的实现原理。synchronized的实现原理可以查看上篇文章。原创 2020-01-18 22:10:38 · 1187 阅读 · 2 评论 -
从源码分析Synchronized实现原理
线程安全:1、多个线程操作共享资源。2、对共享资源的操作会使得共享资源发生变化。public class SecurityDemo { private static int count = 0; public static void main(String[] args) throws InterruptedException { for (int i = 0...原创 2020-01-14 21:10:21 · 1923 阅读 · 2 评论 -
java线程状态变更及中断实现
java创建线程的几种方式1、实现Runnable接口。public class RunnableDemo implements Runnable{ public static void main(String[] args) { //写法1 new Thread(new RunnableDemo(), "runnable线程1").start();...原创 2019-12-02 22:26:35 · 1083 阅读 · 2 评论 -
代理模式 --- 静态代理与动态代理;动态代理的实现原理;手写实现自己的动态代理;比较jdk与cglib;
这篇文章,并不是教你如何使用代理,而是解决以下几个问题:分析静态代理存在的问题。分析jdk动态代理执行过程和实现原理。动手实现自己的动态代理。分析CGlib的动态代理实现原理。比较CGlib动态代理和jdk动态代理。1 静态代理及存在的问题1.1 静态代理在实际的开发中,我们可能会遇到这种问题,如:现在有一个订单的服务接口,以及其实现类如下:/** * 订单服务 */p...原创 2019-08-31 13:59:58 · 401 阅读 · 0 评论