自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Spring之basePackages包扫描器原理(ASM)

https://www.sangyuancheng.com/blog/detail/183

2021-05-26 16:24:14 342 1

原创 理解、学习和使用Java中Optional

理解、学习和使用Java中Optional 从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题就是 NPE(NullPointerException),NPE是每个 Java 程序员都非常了解的异常。 本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。 Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。 从一个案例开始说起 我们先从一个简单的

2021-01-15 18:25:55 136 2

原创 45张图!ThreadLocal的最牛辨析!

45张图!ThreadLocal的最牛辨析!

2021-01-15 18:22:29 99

原创 synchronized原理分析(一)

synchronized的作用 synchronized是Java中解决高并发问题的一种常见方案,也是最简单的一种方法。作为synchronized,JVM为我们确保了以下三种特性: 1.原子性:确保代码在同一时间只有一个线程在执行(所谓先到先得) 2.可见性:确保共享变量的修改操作能够即使可见(就是拿锁前从主内存拿最新的,解锁前先刷回主内存) 有序性:避免指令重排序(一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作) 锁如何使用就不用多说了,想必大家都会了 ??

2020-10-09 17:12:03 152

原创 Java同步锁的实现

Java的内置锁一直都是备受争议的。 在JDK1.6之前,synchronized这个重量级锁的性能一直都是较为低下; 虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的; synchronized提供了便捷性的隐式获取锁、释放锁机制(基于JVM机制),但是它却缺少了获取、释放锁的可操作性、可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣。 实现自己的同步锁 【先来看看这个栗子】在一个不加锁的情况下,多个线程对同一个资源的操作(如下代码),我们.

2020-10-07 14:09:13 356

原创 并发编程 - JMM和底层实现原理(volatile、final、synchronized)、JDK8新特性

操作系统内存划分 寄存器->一级缓冲区(分为数据缓冲区,指令缓冲区)->二级缓冲区->三级缓冲区->内存->磁盘->远程文件服务器,缓冲区按照缓冲行存储与读取 物理内存模型带来的问题 因为每个cpu核心都享有自己的缓冲区,所以实际上在数据操作后,会先写到自己的缓冲区内,然后再刷新回主存,至于什么时候刷新是个不确定的因素。因此,在多线程环境下,对两个变量进行操作时,有可能导致另一个线程获取的数据不是最新的,可以采用加锁或者volatile关键字来保证数据的一致性。 伪共享

2020-05-14 18:17:51 362

原创 并发编程 - 线程池ThreadPoolExecutor、自定义实现线程池、定时任务、并发安全

为什么要使用线程池? 在Java中,创建一个线程只需要通过 new Thread(),就可以创建一个线程。那么创建一个线程需要经历以下几个步骤: 1、创建(T1:向操作系统申请内存) 2、运行(T2:执行run方法中业务) 3、销毁(T3:销毁当前线程并释放资源) 所以,在每一次new出一个线程需要消耗的时间为T1+T2+T3,可以发现,只有运行的业务不同,其他时间都不属于业务处理时间,因此...

2020-05-05 23:39:22 618

原创 并发编程 - 跳表、写时复制容器、阻塞队列

什么是跳表 跳表是用于解决链表的查找问题,由于性能上链表比数组新增元素要快,查询比数组要慢,所以因此引入了跳表技术。跳表的实现上,是通过概率性在table上面添加索引,通过索引的方式查询上,解决了速度慢的问题,由于使用了索引,该跳表在数据上是属于有序的列表。 ConcurrentSkipListMap、ConcurrentSkipListSet是有序的列表,它是(CAS)保证了在多线程环境下线...

2020-05-05 15:23:43 220

原创 并发编程 - Hash、位运算、HashMap、ConcurrentHashMap

什么是Hash? Hash,又称之为散列,将一个任意长度的输入通过散列算法之后,变成一个固定的输出,该值也称之为散列值,这种转换也称之为压缩映射。 最常见的散列算法:直接取余法、乘法取整法、平方取中法。 解决hash冲突的方式:开放寻址法(ThreadLocalMap)、再散列、链地址法(HashMap、ConcurrentHashMap)。 十进制与二进制 日常生活中,通过数字计算均采用的...

2020-05-04 21:35:56 225

原创 并发编程 - LockSupport工具类、CLH队列锁、AQS(AbstractQueuedSynchronizer)同步队列锁

什么是LockSupport LockSupport用于将当前线程进行阻塞,然后由其他线程进行唤醒的一个工具类,适用于A线程执行时,执行到一定位置时,需要进行阻塞,等待其他线程唤醒,与join方法有点类似。以下时Java实现代码。 public class lockSupport { public static void main(String[] args) { Thread thre...

2020-05-01 19:08:25 144

原创 并发编程 - Lock、ReentrantLock、ReentrantReadWriteLock、内置锁与显示锁

什么是显示锁? 显示锁,在Java开发中,是由程序可控的,例如lock方法,在调用lock方法之前,可以尝试调用tryLock来判断是否可以拿到锁,如果可以拿到锁,那么进行获取锁时执行的业务否则可以去执行其他不需要锁去执行的业务,在tryLock时可以指定等待超时时间,例如尝试拿锁超时了,可以直接调用lock无限时等待下去或者抛出异常。 什么是内置锁? 内置锁,是由Java内部来调节锁的获取...

2020-05-01 16:22:57 189

原创 并发编程 - CAS学习、理解

什么是CAS CAS是现代处理器内部实现,用于解决在多线程环境下,通过对同一内存地址的值进行修改时,确保该操作,是原子的。 主要实现原理,在提交修改时,将该内存地址中原值进行取出,与传入的旧值进行比较,如果一致,那么将新值写入该内存地址。 在Java中,提供了三种类型操作类: 普通类型 AtomicInteger:用于对整形数据的修改 AtomicIntegerArray:用于对数组整形...

2020-04-30 17:58:20 82

原创 并发编程 -线程、进程、fork-join、wait与notify

线程与线程之间是通过协作来调度的 需要结束一个线程,不推荐使用stop方法,因为该方法不一定会释放该线程所产生的资源回收。 推荐使用interrupt、isinterrupt、isinterrupted来配合使用 线程中共享变量ThreadLocal,用于存放当前线程内所使用的变量 需要注意: 1.使用时需要判断值是否为空,因为采用的弱引用,所以在gc时会被回收 2.使用完必须要remove...

2020-04-29 19:07:22 343

原创 并发编程学习 - 线程基础、线程之间的共享与协作 - Java篇

线程与进程的关系(Windows) 进程 进程是操作系统对资源分配的最小单位,其中包括了CPU、内存空间、磁盘IO等,同一进程中多个线程共享该进程中的全部资源,进程与进程之间是相互独立的。进程是拥有一定独立功能的程序,在某个数据集合上的一次运行活动,进程是系统资源分配和调度的一个独立单位。 用户进程与系统进程 进程是在计算机上的一次执行活动,当你运行一个程序时,你就创建了一个进程。 用户...

2020-04-20 17:03:55 126

空空如也

空空如也

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

TA关注的人

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