- 博客(14)
- 收藏
- 关注
转载 Spring之basePackages包扫描器原理(ASM)
https://www.sangyuancheng.com/blog/detail/183
2021-05-26 16:24:14
367
1
原创 理解、学习和使用Java中Optional
理解、学习和使用Java中Optional从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题就是 NPE(NullPointerException),NPE是每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。从一个案例开始说起我们先从一个简单的
2021-01-15 18:25:55
168
2
原创 synchronized原理分析(一)
synchronized的作用synchronized是Java中解决高并发问题的一种常见方案,也是最简单的一种方法。作为synchronized,JVM为我们确保了以下三种特性:1.原子性:确保代码在同一时间只有一个线程在执行(所谓先到先得)2.可见性:确保共享变量的修改操作能够即使可见(就是拿锁前从主内存拿最新的,解锁前先刷回主内存)有序性:避免指令重排序(一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作)锁如何使用就不用多说了,想必大家都会了 ??
2020-10-09 17:12:03
163
原创 Java同步锁的实现
Java的内置锁一直都是备受争议的。在JDK1.6之前,synchronized这个重量级锁的性能一直都是较为低下;虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的;synchronized提供了便捷性的隐式获取锁、释放锁机制(基于JVM机制),但是它却缺少了获取、释放锁的可操作性、可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣。实现自己的同步锁【先来看看这个栗子】在一个不加锁的情况下,多个线程对同一个资源的操作(如下代码),我们.
2020-10-07 14:09:13
367
原创 并发编程 - JMM和底层实现原理(volatile、final、synchronized)、JDK8新特性
操作系统内存划分寄存器->一级缓冲区(分为数据缓冲区,指令缓冲区)->二级缓冲区->三级缓冲区->内存->磁盘->远程文件服务器,缓冲区按照缓冲行存储与读取物理内存模型带来的问题因为每个cpu核心都享有自己的缓冲区,所以实际上在数据操作后,会先写到自己的缓冲区内,然后再刷新回主存,至于什么时候刷新是个不确定的因素。因此,在多线程环境下,对两个变量进行操作时,有可能导致另一个线程获取的数据不是最新的,可以采用加锁或者volatile关键字来保证数据的一致性。伪共享
2020-05-14 18:17:51
375
原创 并发编程 - 线程池ThreadPoolExecutor、自定义实现线程池、定时任务、并发安全
为什么要使用线程池?在Java中,创建一个线程只需要通过 new Thread(),就可以创建一个线程。那么创建一个线程需要经历以下几个步骤:1、创建(T1:向操作系统申请内存)2、运行(T2:执行run方法中业务)3、销毁(T3:销毁当前线程并释放资源)所以,在每一次new出一个线程需要消耗的时间为T1+T2+T3,可以发现,只有运行的业务不同,其他时间都不属于业务处理时间,因此...
2020-05-05 23:39:22
645
原创 并发编程 - 跳表、写时复制容器、阻塞队列
什么是跳表跳表是用于解决链表的查找问题,由于性能上链表比数组新增元素要快,查询比数组要慢,所以因此引入了跳表技术。跳表的实现上,是通过概率性在table上面添加索引,通过索引的方式查询上,解决了速度慢的问题,由于使用了索引,该跳表在数据上是属于有序的列表。ConcurrentSkipListMap、ConcurrentSkipListSet是有序的列表,它是(CAS)保证了在多线程环境下线...
2020-05-05 15:23:43
235
原创 并发编程 - Hash、位运算、HashMap、ConcurrentHashMap
什么是Hash?Hash,又称之为散列,将一个任意长度的输入通过散列算法之后,变成一个固定的输出,该值也称之为散列值,这种转换也称之为压缩映射。最常见的散列算法:直接取余法、乘法取整法、平方取中法。解决hash冲突的方式:开放寻址法(ThreadLocalMap)、再散列、链地址法(HashMap、ConcurrentHashMap)。十进制与二进制日常生活中,通过数字计算均采用的...
2020-05-04 21:35:56
252
原创 并发编程 - LockSupport工具类、CLH队列锁、AQS(AbstractQueuedSynchronizer)同步队列锁
什么是LockSupportLockSupport用于将当前线程进行阻塞,然后由其他线程进行唤醒的一个工具类,适用于A线程执行时,执行到一定位置时,需要进行阻塞,等待其他线程唤醒,与join方法有点类似。以下时Java实现代码。public class lockSupport { public static void main(String[] args) { Thread thre...
2020-05-01 19:08:25
151
原创 并发编程 - Lock、ReentrantLock、ReentrantReadWriteLock、内置锁与显示锁
什么是显示锁?显示锁,在Java开发中,是由程序可控的,例如lock方法,在调用lock方法之前,可以尝试调用tryLock来判断是否可以拿到锁,如果可以拿到锁,那么进行获取锁时执行的业务否则可以去执行其他不需要锁去执行的业务,在tryLock时可以指定等待超时时间,例如尝试拿锁超时了,可以直接调用lock无限时等待下去或者抛出异常。什么是内置锁?内置锁,是由Java内部来调节锁的获取...
2020-05-01 16:22:57
201
原创 并发编程 - CAS学习、理解
什么是CASCAS是现代处理器内部实现,用于解决在多线程环境下,通过对同一内存地址的值进行修改时,确保该操作,是原子的。主要实现原理,在提交修改时,将该内存地址中原值进行取出,与传入的旧值进行比较,如果一致,那么将新值写入该内存地址。在Java中,提供了三种类型操作类:普通类型AtomicInteger:用于对整形数据的修改AtomicIntegerArray:用于对数组整形...
2020-04-30 17:58:20
89
原创 并发编程 -线程、进程、fork-join、wait与notify
线程与线程之间是通过协作来调度的需要结束一个线程,不推荐使用stop方法,因为该方法不一定会释放该线程所产生的资源回收。推荐使用interrupt、isinterrupt、isinterrupted来配合使用线程中共享变量ThreadLocal,用于存放当前线程内所使用的变量需要注意:1.使用时需要判断值是否为空,因为采用的弱引用,所以在gc时会被回收2.使用完必须要remove...
2020-04-29 19:07:22
363
原创 并发编程学习 - 线程基础、线程之间的共享与协作 - Java篇
线程与进程的关系(Windows)进程进程是操作系统对资源分配的最小单位,其中包括了CPU、内存空间、磁盘IO等,同一进程中多个线程共享该进程中的全部资源,进程与进程之间是相互独立的。进程是拥有一定独立功能的程序,在某个数据集合上的一次运行活动,进程是系统资源分配和调度的一个独立单位。用户进程与系统进程进程是在计算机上的一次执行活动,当你运行一个程序时,你就创建了一个进程。用户...
2020-04-20 17:03:55
136
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人