java
文章平均质量分 66
薛定e的猫
这个作者很懒,什么都没留下…
展开
-
AQS应用-Semaphore
生活(工作)原创 2018-11-22 00:10:59 · 154 阅读 · 0 评论 -
JAVA并发容器:CopyOnWriteArrayList与CopyOnWriteArraySet
生活所有的程序员都剧作家,而所有计算机都是糟糕的演员。CopyOnWriteArrayList介绍还记得学集合的时候,学的第一个集合就是ArrayList.它是一个由数组实现的集合。因为他对数组的增删改和查询都是不加锁的,所以它并不是线程安全的。因此,我们会引入到一个线程安全的集合,Vector,他的底层也是数组,与ArrayList不同的是,Vector里对元素的增删改查都是加了sync...原创 2018-12-03 23:30:39 · 311 阅读 · 0 评论 -
JAVA集合:for循环、foreach、迭代器效率比较
前言写代码的过程中,经常需要遍历集合,选择一个搞笑的遍历方法非常重要,今天来看下for循环、foreach、迭代器效率比较,主要从ArrayList和LinkedList来分析。直接上代码测试ArrayList List<Integer> integers = Lists.newArrayList(); for(int i=0;i<1000...原创 2018-12-12 23:51:16 · 8915 阅读 · 1 评论 -
JAVA集合:迭代器实现原理
前言在JAVA的学习和开发中,经常需要对集合或者数组进行遍历,遍历的方法有多种:for循环、foreach、迭代器。for循环的实现简单明了,就是循环下标,判断边界,取到每个下标的数据。至于foreach和迭代器,其实foreach在反编译以后可以看到就是迭代器实现的,因此,今天来学习一下迭代器的实现原理。Iterable 与 IteratorIterable://Iterable用来标...原创 2018-12-12 23:16:47 · 4025 阅读 · 0 评论 -
JAVA并发容器:ConcurrentSkipListMap
二分查找什么是跳跃表?跳跃表如果查询?跳跃表如何增删?ConcurrentSkipListMap 成员ConcurrentSkipListMap 构造器ConcurrentSkipListMap putConcurrentSkipListMap get原创 2018-12-05 23:59:09 · 662 阅读 · 0 评论 -
JAVA并发编程: PriorityQueue -》阻塞队列 PriorityBlockingQueue
生活一旦一种新技术开始滚动碾压道路,如果你不能成为压路机的一部分,那么你就只能成为道路的一部分。PriorityQueue阻塞队列里的PriorityBlockingQueue基于PriorityQueue,所以在研究PriorityBlockingQueue之前要先研究一下PriorityQueue,这是一个有优先级概念的队列,是有顺序的,他的顺序是通过内部的比较器实现。他的内部维护了一...原创 2018-12-01 22:48:03 · 1192 阅读 · 0 评论 -
java并发编程:阻塞队列-SynchronousQueue
生活Don’t worry if it doesn’t work right. If everything did, you’d be out of a job. (Mosher’s Law of Software Engineering)不要担心它能否正常工作。如果一切正常,那么你就会失去工作。前言昨天一天研究了ArrayBlockingQueue和LinkedBlockingQueue...原创 2018-12-01 14:09:17 · 211 阅读 · 0 评论 -
JAVA并发编程:阻塞队列-LinkedBlockingQueue
生活程序员的美德:懒惰,没有耐心以及老子天下第一。LinkedBlockingQueue成员首先来看下LinkedBlockingQueue的成员: //Integer.MAX_VALUE 默认容量 Integer.MAX_VALUE,可以认为是无界的 private final int capacity; //队列中元素的数量 private final Ato...原创 2018-11-30 21:51:26 · 533 阅读 · 0 评论 -
JAVA并发编程:synchronized关键字深入解析
生活天气贼好的一个礼拜二的吃完晚饭的晚上。他们去听课了。不想写代码。我在这看点东西吧~闲谈对于synchronized的记忆是最早对同步的概念。那时候聊到同步,就会说到StringBuilder和StringBuffer,里面 的方法都是一样的,但是StringBuffer里的方法都加了synchronized来修饰,所以是线程安全的。这个关键字在JDK1.6以前还是挺笨重的,性能很...原创 2018-11-27 23:44:17 · 214 阅读 · 0 评论 -
JAVA并发容器:为什么说ConcurrentHashMap是弱一致性的?
ConcurrentHashMap的弱一致性体现在clear、迭代器和get方法,原因在于没有加锁。举例:迭代器在遍历数据的时候是一个Segment一个Segment去遍历的,如果在遍历完一个Segment时正好有一个线程在刚遍历完的Segment上插入数据,就会体现出不一致性。clear也是一样。get方法在取数据的时候,如果有一个线程正好在put,假设他put的key是存在的,那么ge...原创 2018-12-13 17:33:23 · 3641 阅读 · 4 评论 -
JAVA基础:Thread深入学习
生活不断规划与寻找自己的人生,想法把自己变重要;Thread实例线程是进程的最小执行单位,今天来看看JAVA中的Thread。创建Thread,并且运行的方法大家都会了。咱们往深走。public class MyThread extends Thread{ @Override public void run() { System.out.printl...原创 2018-12-07 00:35:52 · 197 阅读 · 0 评论 -
JAVA基础:反射
什么是反射?反射可以在运行时动态加载类,创建对象。这种类和对象在编译期间都是不确定的,只有在运行到对应的反射代码才能确定下来。反射还可以获取对象自身的信息,包括属性、方法等,并且可以打破访问修饰符的限制,设置并访问私有的属性,获取并调用私有的方法。通过反射加载类反射,最刚开始接触其实是在jdbc的学习中。看下面获取mysql连接的代码//反射加载mysql驱动Class.forName...原创 2018-12-17 21:09:55 · 464 阅读 · 0 评论 -
JAVA并发编程:Future
生活在水中行走,和根据一份需求开发软件一样,如果它们都 “冻” 住了,那就容易多了。前言前面学习了ThreadPoolExecutor,还学习了大神们提供的预先设置好的三个ThreadPoolExecutor,使得我们能更加方便得使用线程池。在使用线程池的时候,有一些情况不需要返回返回值,但是也有很大情况要求返回线程执行的结果,比如一个操作是成功还是失败。因此我们需要提交线程到线程池,并且...原创 2018-12-10 23:38:07 · 349 阅读 · 0 评论 -
JAVA并发编程:Executors
生活为什么我们总是问为什么?前言JAVA的开发人员,大概是认为我们这种JAVA的使用者太蠢了,所以给我们预先提供了三个现成的线程池。现在就来剖析下,注意,都在Executors类下。newFixedThreadPool public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFa...原创 2018-12-09 23:06:26 · 106 阅读 · 0 评论 -
JAVA并发编程:线程池 ThreadPoolExecutor
生活前期追深度,否则会华而不实,后期追广度,否则会坐井观天;前言在前面,我们已经对Thread有了比较深入的了解,并且已经学会了通过new Thread()来创建一个线程,并通过start方法来启动一个线程,这种方法非常简单,同样也存在弊端:1、每次通过new Thread()创建对象性能不佳2、线程缺乏统一管理,可能无限创建线程,相互竞争,极端情况下回出现OOM3、无法提供定时执行、...原创 2018-12-09 22:04:26 · 137 阅读 · 0 评论 -
JAVA基础:DirectByteBuffer
生活什么是DirectByteBuffer?什么时候用到它?DirectByteBuffer 申请与回收DirectByteBuffer 可能会出现什么问题?原创 2018-12-09 13:59:47 · 5320 阅读 · 1 评论 -
JAVA基础:强引用、软引用、弱引用、虚引用
生活强引用软引用弱引用虚引用原创 2018-12-08 22:24:06 · 149 阅读 · 0 评论 -
JAVA基础:ThreadLocal
生活什么是ThreadLocalThreadLocal的作用ThreadLocal图示ThreadLocal源码解析如何在子线程获取到父线程的数据?ThreadLocal有什么缺陷?原创 2018-12-08 00:07:32 · 422 阅读 · 0 评论 -
JAVA并发编程:volatile关键字深入解析
生活天气贼好的一个礼拜二。生活就是生下来活下去。简述volatile是JAVA中的一个关键字,在JDK1.5以前据说饱受争议,在程序中使用经常出现一些出入意料的结果。这个么,从volatile的翻译就能看出来,就是不稳定的意思嘛。JDK1.5以后,volatile才重获生机。(我认为是Doug Lea写的并发包把它发扬光大了)。学习它有什么用?1、有助于内存模型的深入了解2、有助...原创 2018-11-27 17:28:25 · 114 阅读 · 0 评论 -
AQS应用-CyclicBarrier
生活生活就是今天不想吃午饭,然后去楼下买了个面包,发现面包很难吃还是强忍着吃了几口。剩下的留到明早做早餐,场景写代码写累了,想去看看大海!于是我报了个去南麂岛的旅游团,听说那里很美。然后。。。今天的故事场景就来了。既然是跟团游,势必要跟着导游走。早上6点30(不得不吐槽,每次跟团旅游都很早,累得要死哈哈)到达指定上车点。上车等了许久都不出发,事实上大部分人都已经到了,就等1、2个起不...原创 2018-11-20 13:05:47 · 267 阅读 · 0 评论 -
JAVA并发编程:内存模型
生活喝着舍友打的豆浆,贼爽,所以继续学习咯!!!————在JAVA的并发编程中,有一个很重要的东西需要搞清楚,那就是内存模型。内存模型的目标:定义了程序中变量的访问规则,以及虚拟机存储变量到内存,从内存中取出变量的底层细节。这里所说的变量不包括局部变量、方法参数等线程私有的变量,这些变量本身不存在竞争问题,自然也无需再多线程的开发中研究。内存模型细节:JVM规定了所有的变量都存储在...原创 2018-11-25 17:12:04 · 1981 阅读 · 0 评论 -
AQS应用-ReentrantLock(可重入锁)
生活我大概是一个暴躁的人,有事就说,有屁就放,磨磨唧唧,支支吾吾真的受不了。今天很暴躁。!!场景下面就来强行写今天的东西。在并发编程中,有个非常重要的概念 锁。没错很强行。这里的锁,其实和现实中的锁很相似。举个有点恶心的例子,上厕所。没错还是强行~公司有800人,假设只有一个厕所,现在有40人要上厕所,能一起上吗?不能。所以怎么办,排队等待,等到厕所没人了可以进去上厕所,进去以后第...原创 2018-11-22 22:47:18 · 178 阅读 · 0 评论 -
AQS初探-下篇
源码详解本篇了解一下AQS的源码实现。依照acquire-release、acquireShared-releaseShared的次序来。1、acquire(int)独占模式下线程获取共享资源的顶层入口。如果获取到资源,线程直接返回,否则进入等待队列,直到获取资源为止,且整个过程忽略中断的影响。下面是acquire()的源码:public final void acquire(int a...原创 2018-11-18 23:38:08 · 122 阅读 · 0 评论 -
AQS初探-Node
AQS有一个静态内部类Node,即CHL队列中的节点对象,对象中包含了前驱节点,后驱节点,等待节点的后续节点,等待获取同步状态的线程引用、等待状态。int waitStatus:1、CANCELLED :值为1,当线程等待超时或者被中断,则取消等待,设等待状态为-1,进入取消状态则不再变化。2、SIGNAL :值为-1。后继节点处于等待状态,当前节点(为-1)被取消或者中断时会通知后继节点,...原创 2018-11-17 23:48:06 · 2283 阅读 · 0 评论 -
AQS初探-上篇
一、前述在java的并发编程中,经常聊到锁【ReentrantLock】、计数器【CountdownLatch】、信号量 【Semaphore】、同步屏障【CyclicBarrier】等。而这些类的关键核心就在于AQS【AbstractQueuedSynchronizer】,如名所述,抽象的队列式的同步器。通过对AQS的学习,可以更好的了解理解依赖于它的相关技术实现。废话不多说,下面就来学...原创 2018-11-17 22:20:55 · 272 阅读 · 0 评论 -
AQS应用-CountDownLatch
生活代码无非是生活现实场景的翻译,把某些场景翻译成代码,即简单又复杂。AQS中的应用也与我们的生活息息相关。场景今天来看一个有趣的场景,经历过学生时代的,都对那段必须跑的长跑深恶痛绝,发令枪响开跑,然后等到所有人跑完,老师才会把大家召集起来统一公布成绩。这个场景用程序来模拟,实际就是N个线程执行操作,等全部执行完了,才执行某一个特定操作。countDownLatch正是一个能提供如此功...原创 2018-11-19 23:07:29 · 234 阅读 · 0 评论 -
AQS应用-Condtion
生活今天周五,明天加班。如痴如醉,如梦如醒。—今天开门见山,直接来引入今天的内容。昨天(上一篇)讲到了并发编程开发中非常重要的锁,ReentrantLock,即可重入锁,在这个锁中【其实是在其父接口Lock下】,有个newCondition方法用来创建一个与其锁相关联的条件变量,由于这玩意也是非常之重要,所以单独搞一篇写写,加深记忆。JAVA中的条件变量都实现了java.util.con...原创 2018-11-23 23:20:40 · 335 阅读 · 0 评论 -
JAVA并发编程:三大特性-原子性
生活生活就是生下来,活下去。————在JAVA并发编程,如果要保证程序的线程安全,就要保证代码的原子性、可见性、有序性。今天这一篇先来聊聊原子性。什么是原子性?原子性,即一个操作或多个操作,要么全部执行并且在执行的过程中不被打断,要么全部不执行。(提供了互斥访问,在同一时刻只有一个线程进行访问)JAVA本身的原子性由JAVA内存模型来直接保证具有原子性变量操作 的有read/loa...原创 2018-11-25 22:07:36 · 986 阅读 · 0 评论 -
AQS应用-ReentrantReadWriteLock(可重入读写锁)
生活今天礼拜六,晴,加班,真好!_____今天来研究一下可重入读写锁-ReentrantReadWriteLock。首先要明确的一点是,前面研究的可重入锁ReentrantLock,其实是一个互斥锁,保证在同一时刻只有一个线程获取资源,无论是写写,读读,读写任何场景都是互斥的。这种互斥锁在常见的高并发场景下会显现出糟糕的低吞吐量问题。事实上,在高并发的实际场景下,读的频率远高于写,而且读...原创 2018-11-24 22:47:34 · 776 阅读 · 0 评论 -
JAVA并发编程:阻塞队列-ArrayBlockingQueue
生活有很多的不快乐,其实是源自不满足,而不满足,很多时候是源自于心不定,而心不定则是因为不清楚究竟自己要什么,不清楚要什么的结果就是什么都想要,结果什么都没得到。生产者消费者模式生产者和消费者问题是线程模型中一个经典问题:生产者和消费者在同一个时间段内共用一块内存区域,由生产者在这块内存区域创建消费者需要的数据,由消费者取走数据并消费。对于生产者消费者模型的应用实例,JDK1.5提供了阻...原创 2018-11-30 13:10:17 · 329 阅读 · 0 评论 -
JAVA并发编程:三大特性-可见性、有序性
生活生活就是生下来,活下去。————在JAVA并发编程,如果要保证程序的线程安全,就要保证代码的原子性、可见性、有序性。昨天聊了原子性。今天来看下可见性、有序性。什么是可见性?当多个线程访问同一个变量时,一个线程修改了一个变量的值,其他线程可以马上读取到修改后的值。可见性问题场景说明:两个线程共享一个变量stop.A线程,当stop为false,则一直运行;为true则停止。...原创 2018-11-27 00:33:01 · 737 阅读 · 0 评论 -
JAVA集合:JDK 1.7 与 1.8HashMap 区别
生活写代码的时候总是想象维护你代码的家伙是一个知道你住在哪里的暴力精神病患者。HashMap在以前,学习JAVA集合时,只知道HashMap实现Map接口,底层是一个链表的数组实现,线程不安全,具体咋样,其实并没有去看过。前面看了ConcurrentHashMap,相信现在看HashMap的源码会简单很多。HashMap在 1.7和1.8下的实现有些不同,今天先来看1.7的实现。成员...原创 2018-12-02 16:50:53 · 527 阅读 · 0 评论 -
JAVA并发编程:CAS & ABA
生活如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。——David LeinweberCAS是什么?昨天聊到乐观锁和悲观锁,讲到乐观锁的实现是在多线程下通过CAS不断自旋来更新数据。那么具体什么事CAS呢,CAS即compareAndSwap,翻译过来就是比较和交换,确切的说是比较 旧值与预期值是否一致,如果一致,把值更新为新值,否则不更新。JA...原创 2018-11-29 23:32:24 · 154 阅读 · 0 评论 -
JAVA并发容器:JDK1.7 与 1.8 ConcurrentHashMap 区别
生活为什么我们总是没有时间把事情做对,却有时间做完它?了解ConcurrentHashMap工作中常用到hashMap,但是HashMap在多线程高并发场景下并不是线程安全的。所以引入了ConcurrentHashMap,它是HashMap的线程安全版本,采用了分段加锁的方式来保证线程安全,同样在高并发的场景下有较好的性能。ConcurrentHashMap 组成ConcurrentH...原创 2018-12-02 15:48:21 · 459 阅读 · 0 评论 -
JAVA并发编程:阻塞队列-DelayQueue
生活如果第一次你没有成功,那么称之为1.0版,继续加油。DelayQueue的成员组成今天来学习延时队列,这个玩意儿也是非常重要,在定时器上有用到。首先简单了解下,延时队列就是让指定的数据再指定的时候以后出队,也就是按照时间排序,因此它的核心确实是使用了昨天看的优先队列。下面先来看看DelayQueue的成员//可重入锁 private transient final Reen...原创 2018-12-02 11:46:34 · 200 阅读 · 0 评论 -
JAVA并发编程:Synchronized 与 ReentrantLock 区别
生活周末,难得睡爽一次。真舒服。————今天来聊聊Synchronized与ReentrantLock的区别。JAVA在编写多线程程序时,为了保证线程安全,需要对数据进行同步,常用的同步方式就是Synchronized和ReentrantLock两种。相似点两者的相似点在于,都是可重入互斥锁,都是阻塞式同步。在多线程环境下,当有多个线程竞争同一块资源时,其中一个线程已经获取资源进入同步...原创 2018-11-25 11:55:04 · 182 阅读 · 0 评论 -
JAVA并发编程:悲观锁与乐观锁
生活晴。悲观与乐观的情绪概念本篇来了解一下悲观锁和乐观锁,在了解这两个锁之前,我们首先有必要把悲观和乐观这两个词搞清楚:悲观:对世事怀有消极的看法,认为事物总往糟糕的方向发展。乐观:对世事怀有积极的态度,认为事物总往好的方向发展。何为悲观锁悲观锁:假定会发生并发的冲突,因此屏蔽一切可能违反数据完整性的操作。在整个数据处理过程中,锁定要操作的数据。悲观锁的实现(JAVA/数据库)...原创 2018-11-28 22:40:52 · 530 阅读 · 0 评论 -
JAVA集合:LinkedHashMap
生活按代码行数来评估软件开发的进度,就如同按重量来评估飞机建造的进度。前言之前学习过HashMap,它是一个无序的kv集合,底层通过数组+链表(JDK8:数组+链表+红黑树)实现,今天要学习的叫做LinkedHashMap,这是一个特殊的HashMap,他继承自HashMap,在HashMap的基础上又给每个entry增加了前驱和后继,使之成为一个有序的HashMap,而且可以通过某个参数的...原创 2018-12-12 10:04:19 · 261 阅读 · 0 评论