Java基础
Java基础
吃瓜老鱼
今天的BUG保熟吗?
展开
-
JAVA并发十六:并发容器之ConcurrentLinkedQueue
原博地址:https://www.javazhiyin.com/6299.html1.ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安全的方式,是非常粗暴的在方法上用synchronized独占锁,将多线程执行变成串行化。要想将ArrayList变成线程安全的也可以使用Collec转载 2020-05-17 16:26:30 · 233 阅读 · 0 评论 -
JAVA并发十五:并发容器之CopyOnWriteArrayList
原博地址:https://www.javazhiyin.com/6294.html1.CopyOnWriteArrayList的简介java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModificationException异常,也就是说ArrayList并不是一个线程安全的容器。当然您可以用Vector,或者使用Collections的静态方法将ArrayList包装成一个线转载 2020-05-16 23:15:15 · 141 阅读 · 0 评论 -
JAVA并发十四:并发容器之ConcurrentHashMap(JDK 1.8版本)
原博地址:https://www.javazhiyin.com/6288.html1.ConcurrentHashmap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的方法都采用synchronized进行线程安全的控制。可想而知,在高并发的情况下,每次只有一个线程能够获取对象监视器锁,这样的并发性能的确不令人满意。另外一种方式通过Collections的Maps转载 2020-05-16 23:11:00 · 247 阅读 · 0 评论 -
JAVA并发十三:LockSupport工具
原博地址:https://www.javazhiyin.com/6284.html1.LockSupport简介在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步组件的实现中被频繁使用的LockSupport到底是何方神圣,现在就来看看。LockSuppor转载 2020-05-16 22:57:38 · 178 阅读 · 0 评论 -
JAVA并十二:详解Condition的await和signal等待/通知机制
原博地址:https://www.javazhiyin.com/6274.htmlCondition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和not转载 2020-05-16 22:54:36 · 326 阅读 · 0 评论 -
JAVA并发十一:深入理解读写锁ReentrantReadWriteLock
原博地址:https://www.javazhiyin.com/6269.html1.读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized(关于synchronized可以看这篇文章)或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并不会影响数据正确性(出现脏读转载 2020-05-16 22:45:00 · 179 阅读 · 0 评论 -
JAVA并发十:彻底理解ReentrantLock
原博地址:https://www.javazhiyin.com/6265.html1. ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,要想完完全转载 2020-05-16 22:40:06 · 106 阅读 · 0 评论 -
JAVA并发九:深入理解AbstractQueuedSynchronizer(AQS)
原博地址:https://www.javazhiyin.com/6255.html1. AQS简介在上一篇文章中我们对lock和AbstractQueuedSynchronizer(AQS)有了初步的认识。在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,超时等待锁获取这些转载 2020-05-16 22:35:45 · 202 阅读 · 0 评论 -
JAVA并发八(下):初识Lock与AbstractQueuedSynchronizer(AQS)
原博地址:https://www.javazhiyin.com/999.html1. concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图。其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞队列以及executors,这些就是转载 2020-05-16 22:20:33 · 155 阅读 · 0 评论 -
JAVA并发八(上):三大性质总结:原子性、可见性以及有序性
原博地址:https://www.javazhiyin.com/993.html1. 三大性质简介在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经讲过了),三条性质:原子性,有序性和可见性。关于synchronized和volatile已经讨论过了,就想着将并发编程中这两大神器在 原子性,有序性和可见性上做一个比较,当然这也是面试中的高频考点,值得注意。2. 原子性原子性是指一个操作是不可中断的,要么全部执行成功转载 2020-05-16 22:13:56 · 156 阅读 · 0 评论 -
JAVA并发七:你以为你真的了解final吗?
1. final的简介final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类。即使能够知道final具体的使用方法,我想对final在多线程中存在的重排序问题也很容易忽略,希望能够一起做下探讨。2. final的具体使用场景final能够修饰变量,方法和类,也就是final使用范围基本涵盖了java每个地方,下面就分别以锁修饰的位置:变量,方法和类分别来说一说。2.1 变量在java中变量,可以分为成员变量以及方法局部变量。因转载 2020-05-16 22:10:21 · 230 阅读 · 0 评论 -
JAVA并发六:彻底理解volatile
原博地址:https://www.javazhiyin.com/887.html1. volatile简介在上一篇文章中我们深入理解了java关键字,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下。通过上一篇的文章我们了解到synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机制。但它同时不容易被正确理解,也至于在并发编程中很多程序员转载 2020-05-16 20:18:13 · 140 阅读 · 0 评论 -
java多线程面试题整理及答案(2019年)
原博地址:https://www.cnblogs.com/xiaowangbangzhu/p/10443289.html1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层...转载 2020-04-22 22:31:14 · 271 阅读 · 0 评论 -
JDK:各版本特性详解
直接上链接:JDK8 新特性详解,2014-03-18正式发布JDK9 新特性详解,2017-09-21正式发布JDK10新特性详解,2018-03-20正式发布JDK11新特性详解,2018-09-25正式发布JDK12新特性详解,2019-03-19正式发布JDK13新特性详解,2019-09-17正式发布JDK14新特性详解,2020-03-17正式发布...原创 2020-04-20 23:34:23 · 200 阅读 · 0 评论 -
Java线程安全和非线程安全
原博地址:https://blog.csdn.net/xiao__gui/article/details/8934832非线程安全的现象模拟这里就使用ArrayList和Vector二者来说明。首先先看下以下代码,开启1000个线程,同时调用ArrayList的add方法,每个线程向ArrayList中添加100个数字,如果程序正常执行的情况下应该是输出:list size is :100...转载 2020-04-20 00:02:02 · 151 阅读 · 0 评论 -
Java并发编程:核心理论
原博地址 并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。在此基础...转载 2020-04-19 19:50:13 · 107 阅读 · 0 评论 -
Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)
原博地址一、线程的状态Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。New:新建状态,当线程创建完成时为新建状态,即new Thread(…),还没有调用start方法时,线程处于新建状态。Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU...转载 2020-04-19 19:51:27 · 134 阅读 · 0 评论 -
Java并发编程:Synchronized底层优化(轻量级锁、偏向锁)
原博地址重量级锁上篇文章中向大家介绍了Synchronized的用法及其实现的原理。现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchron...转载 2020-04-19 19:51:42 · 95 阅读 · 0 评论 -
Java并发编程:Synchronized及其实现原理
一、Synchronized原理Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法: (1)修饰普通方法 (2)修饰静态方法 (3)修饰代码块 先...转载 2020-04-19 19:52:13 · 130 阅读 · 0 评论 -
Java并发编程:volatile
1、 volatile的作用相比Sychroni...转载 2020-04-19 19:51:54 · 123 阅读 · 0 评论