自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 HashMap(JDK1.8)

数据结构:数组+链表+红黑树(Java8)原理底层采用链表数组;初始容量为:2^4,且容量为2^n;而Hashtable初始化容量大小为11,且都为素数;所以操作HashMap主要分两步:1.在数组中找到正确的链表;2.在链表中找到正确的元素(遍历链表);而对于上面的第一步,又分两个步骤: hash :该方法主要是将Object转换成一个整型; inde...

2021-06-24 16:07:48 137

原创 Netty

Java 的AIO重要的三个类:AsynchronousServerSocketChannel(服务端)、AsynchronousSocketChannel(客户端)和CompletionHandler(用户处理器)CompletionHandler接口实现应用程序向操作系统发起IO操作Buffer的基本用法就是:初始化(allocate)–> 写入数据(read / put)–> 转换为写出模式(flip)–> 写出数据(get)–> 转换为写入模式(compact)–&g

2021-06-12 10:44:15 1091 1

原创 Object--wait & notify/notifyAll

1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。3、 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。 当线程执行wait()方法时候,会...

2021-05-21 10:57:14 114

原创 Java--JUC并发工具

ReentrantLockReentrantReadWriteLockCountDownLatch (信号量)CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信;主要方法:构造一个用给定计数初始化的 CountDownLatch。CountDownLatch(int count)// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。void await()// 使当前线程在锁存器倒计数至零之前一直等待,除..

2021-05-21 10:21:35 107

原创 ReentrantReadWriteLock

ReentrantReadWriteLock包含了两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为独占锁;线程进入读锁的前提条件:没有其他线程的写锁,没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。线程进入写锁的前提条件:没有其他线程的读锁没有其他线程的写锁而读写锁有以下三个重要的特性:(1)公平选择性:支持非公平(默认)和公平的锁获取方式,吞吐量还是非公平优于公平。(2)重入:读锁和写锁都支持线程重进入。(3)锁降级:遵循获取写锁、获取读锁再释放

2021-05-10 10:22:55 67

原创 ReentrantLock

支持两种实现模式:非公平、公平非公平锁的非公平性用以下例子来解释:持有锁的线程A正在running,队列中有线程BCDEF被挂起并等待被唤醒; 在某一个时间点,线程A执行unlock,唤醒线程B; 同时线程G执行lock,这个时候会发生什么?线程B和G拥有相同的优先级,这里讲的优先级是指获取锁的优先级,同时执行CAS指令竞争锁。如果恰好线程G成功了,线程B就得重新挂起等待被唤醒。public class ReentrantLock implements Lock, java.io.S.

2021-05-08 21:21:48 60

原创 JAVA的锁

乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java 中的乐观锁基本都是通过Unsafe的CAS(Compare And Swap,翻译过来就是比较并替换)操作实现的;悲观锁悲观锁是就是悲观思想,即认为读少写多,遇到并发写的可能性高,每次去拿数..

2021-05-08 18:10:29 74

原创 AbstractQueuedSynchronizer解析

位于java.util.concurrent.locks

2021-05-08 18:07:29 224

原创 volatile的实现原理

原理为了提高处理器的执行速度,在处理器和内存之间增加了多级缓存来提升。但是由于引入了多级缓存,就存在缓存数据不一致问题;但是,对于volatile变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中;但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议;缓存一致性协议每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值

2021-03-10 15:43:58 68

原创 synchronized的实现原理

作用1. 原子性,保证代码块同一时间只被一个线程访问到;2. 可见性,在进入同步代码块后,保证被锁变量取到的值就是真实值;(利用了java的内存模型特性:对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值)3. 有序性,有效解决代码重排问题,即unlock和lock操作倒置执行的问题;(实际上,synchronize是无法禁止指令重排和处理器优化

2021-03-10 15:17:30 832

原创 1. Java基础知识(二)

Java反射根据类全名可以得到该类的所有属性和方法信息,从而动态创建、修改和操作类和对象;使得程序在运行期有了动态的特性,类似php等解释性语言,编码更加灵活,代码耦合性更低,但也降低了运行效率和稳定性;代理模式 静态代理 组成:代理对象(包工头)、目标对象(工人)、目标对象的接口(服务事项);用途: 控制目标对象的访问权限; 避免创建大对象,通过使用一个代理小对象来代表一个真实的大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度; ...

2021-02-24 10:41:43 155

原创 1. Java基础知识(一)

数据类型1. 基本数据类型我们都知道在 Java 语言中,new一个对象是存储在堆里的,我们通过栈中的引用来使用这些对象;所以,对象本身来说是比较消耗资源的。对于经常用到的类型,如 int 等,如果我们每次使用这种变量的时候都需要 new 一个 Java 对象的话,就会比较笨重。所以,和 C++ 一样,Java 提供了基本数据类型,这种数据的变量不需要使用 new 创建,他们不会在堆上创建,而是直接在栈内存中存储,因此会更加高效。数值型在超出既定范围的时候,不会报错也不会抛出异常,所以在某.

2021-01-31 22:03:09 146

原创 0. 面向对象

封装、继承、多态1.多态同一操作在不同对象有不同的实现过程;一种运行期的状态;有类继承或者接口实现、子类要重写父类的方法、父类的引用指向子类的对象;多态应该是一种运行期特性,Java中的重写是多态的体现。不过也有人提出重载是一种静态多态的想法,这个问题在StackOverflow等网站上有很多人讨论,但是并没有什么定论;2.继承和实现继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们的相同部分都放到父类里,让他们都继承这个类;实现:如果多个类处理的目标是一

2021-01-31 16:00:18 65

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除