Java 基础进阶
文章平均质量分 87
万丈高楼平地起!只有打好了基础才能站的更远。该系列博文,是本人阅读各类资料所总结的知识,对java基础进行剖析!巩固基础,提高技术,不惧困难,勇登高峰........
大明哥_
大明哥,一个专注 Java 技术的硬核程序员,「死磕 Java」 创始人。
展开
-
【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier、Barrier、Phaser,这篇博客介绍最后一个:Exchanger。JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchang原创 2015-11-30 09:17:53 · 3496 阅读 · 2 评论 -
【Java并发编程实战】—–“J.U.C”:ReentrantLock之一简介
注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述。本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的lock、unlock实现机制。ReentrantLock,可重入的互斥锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchron原创 2015-08-17 18:26:25 · 5046 阅读 · 1 评论 -
【Java并发编程实战】—– AQS(三):阻塞、唤醒:LockSupport
在上篇博客(【Java并发编程实战】—– AQS(二):获取锁、释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起;在释放锁后,需要唤醒该线程的继任节点lock方法,在调用acquireQueued():if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckI原创 2015-12-27 11:28:58 · 12109 阅读 · 3 评论 -
【Java并发编程实战】—–“J.U.C”:ReentrantLock之二lock方法分析
前一篇博客简单介绍了ReentrantLock的定义和与synchronized的区别,下面跟随LZ的笔记来扒扒ReentrantLock的lock方法。我们知道ReentrantLock有公平锁、非公平锁之分,所以lock()我也已公平锁、非公平锁来进行阐述。首先我们来看ReentrantLock的结构【图来自Java多线程系列–“JUC锁”03之 公平锁(一)】:从上图我们可以看到,Reent原创 2015-08-19 15:07:36 · 7982 阅读 · 6 评论 -
【Java并发编程实战】-----“J.U.C”:AQS分析(一)
在前面博客中,LZ讲到了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch,他们都有各自获取锁的方法,同时相对于Java的内置锁,他们具有明显的优势:花最小的空间开销创建锁、最少的时间开销获得锁、使用更加方便灵活。参考Java的内置锁,对于JUC同步器而言,他应该具备两个最基本的功能:获取锁,释放锁。其中获取锁应该是先判断当前原创 2015-12-17 17:50:01 · 6503 阅读 · 0 评论 -
【Java并发编程实战】—–“J.U.C”:锁,lock
在java中有两种方法实现锁机制,一种是在前一篇博客中(【java7并发编程实战】—–线程同步机制:synchronized)介绍的synchronized,而另一种是比synchronized更加强大和领过的Lock。Lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区,相对于synchronized,Lock接口及其实现类提供了更加强大、灵活的锁机制。一个简单的锁在使用synchr原创 2015-08-10 17:28:58 · 5769 阅读 · 3 评论 -
【Java并发编程实战】-----“J.U.C”:AQS分析(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放。AQS锁获取AQS包含如下几个方法:acquire(int arg):以独占模式获取对象,忽略中断。acquireInterruptibly(int arg): 以独占模式获取对象,如果被中断则中止。acquireShared(int arg): 以共享模式获取对象,忽略中断。acquireSharedInterruptibly原创 2015-12-24 17:53:20 · 6174 阅读 · 0 评论 -
【Java并发编程实战】—–“J.U.C”:Condition
在看Condition之前,我们先来看下面这个例子:工厂类,用来存放、取出商品:public class Depot { private int depotSize; //仓库大小 private Lock lock; //独占锁 public Depot(){ depotSize = 0; lock = n原创 2015-09-06 12:48:12 · 4409 阅读 · 5 评论 -
【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析
前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获取锁。但是对于unlock()而已,它是不分为公平锁和非公平锁的。public void unlock() { sync.release(1); } public f原创 2015-08-25 08:10:31 · 4029 阅读 · 5 评论 -
【Java并发编程实战】-----“J.U.C”:CLH队列锁
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列。他能够确保无饥饿,严格的先来先服务的公平性。下图是CLH队列节点的示意图:在CLH队列的节点QNode中包含有一个locked的字段,该字段表示该节点是否需要获取锁,为true表示需要获取,为false表示不需要获取。在CLH队列中,节点与节点之间并不是通过next指针来连接的而是通过myPred原创 2015-12-10 09:47:55 · 8291 阅读 · 2 评论 -
【Java并发编程实战】—–synchronized
在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者、写相同的数据,访问相同的文件等等。对于这种情况如果我们不加以控制,是非常容易导致错误的。在java中,为了解决这个问题,引入临界区概念。所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问。在java中为了实现临界区提供了同步机制。当一个线程试图访问一个临界区时,他将使用一种同步机制来查看是不是已经有其他线原创 2015-08-04 17:59:18 · 9128 阅读 · 8 评论 -
【Java并发编程实战】—–“J.U.C”:CAS操作
CAS,即Compare and Swap,中文翻译为“比较并交换”。对于JUC包中,CAS理论是实现整个java并发包的基石。从整体来看,concurrent包的实现示意图如下:i++是一个非常经典的操作,它几乎充斥着我们每个人编写的代码中。我们知道i++是可以分解的,它分解为getI()、i + 1 、setI三个步骤,所以它并不是原子操作。如果i==1,执行两次i++操作,我们期望的结果是3原创 2015-12-07 09:27:42 · 4833 阅读 · 0 评论 -
【Java并发编程实战】—–“J.U.C”:CountDownlatch
上篇博文(【Java并发编程实战】—–“J.U.C”:CyclicBarrier)LZ介绍了CyclicBarrier。CyclicBarrier所描述的是“允许一组线程互相等待,直到到达某个公共屏障点,才会进行后续任务”。而CountDownlatch和它也有一点点相似之处:CountDownlatch所描述的是“在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待”。在JDK原创 2015-11-12 09:27:28 · 4402 阅读 · 3 评论 -
【Java并发编程实战】—–“J.U.C”:CyclicBarrier
在上篇博客(【Java并发编程实战】—–“J.U.C”:Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier。在JDK API中是这么介绍的:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为原创 2015-11-04 12:07:12 · 3684 阅读 · 0 评论 -
【Java并发编程实战】—–“J.U.C”:Semaphore
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个“共享锁”。Java并发提供了两种加锁模式:共享锁和独占锁。前面LZ介绍的ReentrantLock就是独占锁。对于独占锁而言,它每次只能有一个线程持有,而共享锁则不同,它允许多个线程并行持有锁,并发访问共享资源。独占锁它所采用的是一种悲观的加锁策略, 对于写而言为了避免冲突独占是必须的,但是对于读就没有必要了,因为它不会原创 2015-09-22 09:11:14 · 4998 阅读 · 0 评论 -
【Java并发编程实战】—–“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁。ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量。在这种情况下任何的“读/读”、“读/写”、“写/写”操作都不能同时发生。然而在实际的场景中我们就会遇到这种情况:有些资源并发的访问中,它大部分时间都是执行读操作,写操作比较少,但是读操作并不影响数据的一致性,如果在进行读操作时采用独占原创 2015-10-31 12:32:00 · 4192 阅读 · 3 评论 -
【Java并发编程实战】—– AQS(四):CLH同步队列
在【Java并发编程实战】—–“J.U.C”:CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形。其主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用;在等待机制上由原来的自旋改成阻塞唤醒。其结构如下:知道其结构了,我们再看看他的实现。原创 2015-12-30 08:31:32 · 11381 阅读 · 0 评论 -
【Java并发编程实战】—–“J.U.C”:Phaser
Phaser由java7中推出,是Java SE 7中新增的一个使用同步工具,在功能上面它与CyclicBarrier、CountDownLatch有些重叠,但是它提供了更加灵活、强大的用法。CyclicBarrier,允许一组线程互相等待,直到到达某个公共屏障点。它提供的await()可以实现让所有参与者在临界点到来之前一直处于等待状态。CountDownLatch,在完成一组正在其他线程中执行原创 2015-11-23 20:17:22 · 3710 阅读 · 1 评论 -
【Java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的“系统”,需要自己好好总结、整理才能征服它。希望同仁们一起来学习Java并发编程,共同进步,互相指导。在学习Java并发之前我们需要先理解一些基本的概念:共享、可变、线程安全性、线程同步、原子性、可见性、有序性。共享和可变要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问。原创 2015-07-26 10:56:21 · 9668 阅读 · 3 评论 -
Java提高配(三七)—–Java集合细节(三):subList的缺陷
我们经常使用subString方法来对String对象进行分割处理,同时我们也可以使用subList、subMap、subSet来对List、Map、Set进行分割处理,但是这个分割存在某些瑕疵。一、subList返回仅仅只是一个视图 首先我们先看如下实例:public static void main(String[] args) { List list1 = new原创 2015-03-06 18:20:06 · 16746 阅读 · 15 评论 -
Java提高篇(三六)-----java集合细节(二):asList的缺陷
在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷:一、避免使用基本数据类型数组转换为列表 使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷。先看如下程序:public static void main(String[] args) { int[] ints = {1,2,3,4,5};原创 2014-08-04 19:24:29 · 9402 阅读 · 6 评论 -
Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量
集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许)。当这个海、容器的量变得非常大的时候,它的初始容量就会显得很重要了,因为挖海、扩容是需要消耗大量的人力物力财力的。同样的道理,Collection的初始容量也显得异常重要。所以:对于已知的情景,请为集合指定初始容量。public static void main原创 2014-08-04 19:19:20 · 24053 阅读 · 11 评论 -
Java提高篇(三四)-----fail-fast机制
在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅原创 2014-07-26 22:40:44 · 62404 阅读 · 54 评论 -
Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap、HashTable、TreeMap的实现方法,从数据结构、实现原理、源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结。 推荐阅读: java提高篇(二三)—–HashMap java提高篇(二五)—–HashTable Java提高篇(二六)-----hashC原创 2014-07-17 16:39:46 · 17960 阅读 · 12 评论 -
Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList、LinkedList、Vector、Stack,通过这几个知识点可以对List接口有了比较深的了解了。只有通过归纳总结的知识才是你的知识。所以下面LZ就List接口做一个总结。推荐阅读: java提高篇(二一)-----ArrayList java提高篇(二二)-----LinkedList原创 2014-07-14 10:18:13 · 8299 阅读 · 8 评论 -
Java提高篇(三一)-----Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的。每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过五个操作对Vector进行扩展,允许将向量视为堆栈。这个五个操作如下: 操作 说明原创 2014-07-14 10:11:21 · 14827 阅读 · 5 评论 -
java提高篇(三十)-----Iterator
迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。Iterator iterator = list.iterator(); while(iterator.hasNext()){ String string = iterator.next(); //do something原创 2014-07-07 17:33:47 · 74616 阅读 · 13 评论 -
java提高篇(二九)-----Vector
在java提高篇(二一)—–ArrayList、java提高篇(二二)—LinkedList,详细讲解了ArrayList、linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现类Vector,Vector 类可以实现可增长的对象数组。一、Vector简介 Vector可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。不过,Vector原创 2014-07-07 17:08:13 · 14328 阅读 · 4 评论 -
Java提高篇(二八)------TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的。在《Java提高篇(二七)-----TreeMap》中LZ详细讲解了TreeMap实现机制,如果客官详情看了这篇博文或者多TreeMap有比较详细的了解,那么TreeSet的实现对您是喝口水那么简单。 一、TreeSet定义 我们知道TreeMap是一个有序的二叉树,那么同理TreeSet同样也是一个有原创 2014-06-07 19:03:01 · 6011 阅读 · 0 评论 -
Java提高篇(二七)-----TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致还是叫做TreeMap比较好。通过这篇博文你可以获得如下知识点: 1、红黑树的基本概念。 2、红黑树增加节点、删除节点的实现过程。 3、红黑树左旋转、右旋转的复杂过原创 2014-05-23 09:23:51 · 224399 阅读 · 78 评论 -
Java提高篇(二六)------hashCode
原文出自:http://cmsblogs.com/?p=631。尊重作者的成果,转载请注明出处! 个人站点:http://cmsblogs.com----------------------------------------------------------------------------------------------------------------------原创 2014-04-09 21:44:05 · 7660 阅读 · 8 评论 -
java提高篇(二五)-----HashTable
原文出自:http://cmsblogs.com/?p=618。尊重作者的成果,转载请注明出处! 个人站点:http://cmsblogs.com-------------------------------------------------------------------------------------------------------------------------原创 2014-04-03 21:44:28 · 51492 阅读 · 21 评论 -
java提高篇(二四)-----HashSet
原文出自:http://cmsblogs.com/?p=599 在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素。所以如果对HashMap比较熟悉,那么HashSet是so easy!!一、定义public class HashSet ext原创 2014-03-24 21:26:07 · 41765 阅读 · 11 评论 -
java提高篇(二三)-----HashMap
>>>>>>>>>>原文参见:http://cmsblogs.com/?p=176 HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。下原创 2014-01-15 21:41:46 · 38381 阅读 · 24 评论 -
java提高篇(二二)-----LinkedList
一、概述 LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表的实现。基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList,而随机访问则比ArrayList逊色些。 LinkedList实现所有可选的列表操作,并允许所有的元素包括nu原创 2014-01-10 23:00:39 · 16876 阅读 · 8 评论 -
java提高篇(二十)-----集合大家族
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等!原创 2014-01-01 10:52:23 · 12816 阅读 · 8 评论 -
java提高篇(十九)-----数组之二
前面一节主要介绍了数组的基本概念,对什么是数组稍微深入了一点点,在这篇博文中主要介绍数组的其他方面。 三、性能?请优先考虑数组 在java中有很多方式来存储一系列数据,而且在操作上面比数组方便的多?但为什么我们还需要使用数组,而不是替代它呢?数组与其他种类的容器之间的区别有三个方面:效率、类型和保存基本类型的能力。在java中,数组是一种效率最高的存储和随机访问对象引原创 2014-01-01 10:41:48 · 8166 阅读 · 11 评论 -
java提高篇(十八)-----数组之一:认识JAVA数组
噢,它明白了,河水既没有牛伯伯说的那么浅,也没有小松鼠说的那么深,只有自己亲自试过才知道!道听途说永远只能看到表明现象,只有亲自试过了,才知道它的深浅!!!!! 一、什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一原创 2014-01-01 10:36:26 · 9579 阅读 · 9 评论 -
java提高篇(十七)-----异常(二)
承接上篇博文:java提高篇(十六)-----异常(一) 五、自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表现程序中可能会遇到的特定问题,总之就是一句话:我们不必拘泥于Java中已有的异常类型。 Java自定义异常的使用要经历如下四个步骤: 1原创 2013-12-29 10:32:40 · 8182 阅读 · 5 评论 -
java提高篇(十六)-----异常(一)
Java的基本理念是“结构不佳的代码不能运行”!!!!! 大成若缺,其用不弊。 大盈若冲,其用不穷。 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失。同样的道理,计算机的世界也是不完美的,异常情况随时都会发生,我们所需要做的就是避免那些能够避免的异常,处理那些不能避免的异常原创 2013-12-29 10:26:08 · 10532 阅读 · 6 评论