从头认识java
文章平均质量分 76
从头认识java
从javase-javaee
李灵晖
正走在技术道路上的求知者
展开
-
从头认识java-特辑-你不知道的static与final的位置问题
这一章节我们来讨论一下你不知道的static与final的位置问题。代码清单package com.ray.test;public class StaticAndFinalPositionTest { private final static int id1 = 0; private static final int id2 = 0; // private static int f原创 2016-04-21 22:39:43 · 3866 阅读 · 1 评论 -
从头认识java-特辑-你不知道的main函数
这一章节我们来讨论一下main函数。对于这个函数大家都不陌生,而且都习以为常,但是其中有一些东西,还是值得我们去总结的。1.普通的mainpackage com.ray.test;public class MainTest { public static void main(String[] args) { }}没什么特别,就是一个main的空方法2.没有static的mainpa原创 2016-04-21 22:49:47 · 2756 阅读 · 4 评论 -
从头认识java-特辑-foreach在java里面两种实现原理总结
这一章节我们来讨论一下foreach在java里面两种实现原理总结。1.数组在数组里面,是固有的foreach实现,直接循环数组(1)代码清单package com.ray.test;public class ForEachInstanceForArray { public static void main(String[] args) { String a = "abc"; for原创 2016-03-21 23:51:23 · 5215 阅读 · 2 评论 -
从头认识java-特辑-总结static
这一章节我们来总结一下static的所有用法。代码清单:package com.ray.test;/** * 静态导入 */import static java.lang.System.out;public class StaticExample { /** * 静态代码块 */ static { out.println("load object"); } /原创 2016-03-20 23:22:19 · 2675 阅读 · 2 评论 -
从头认识java-18.6 synchronized在其他对象上同步和ThreadLocal来消除共享对象的同步问题
这一章节我们来介绍在其他对象上同步与ThreadLocal。前一章节我们使用了1.synchronized在其他对象上同步class ThreadA implements Runnable { private Object object = new Object(); private synchronized void test() throws InterruptedException {原创 2016-01-26 11:42:48 · 1745 阅读 · 1 评论 -
从头认识java-18.5 临界区
这一章节我们来讨论一下临界区。一般来说,我们使用多线程都是直接在方法上面加上synchronized,但是其实这样有些时候对于性能来说,有所欠缺,因此今天来讨论一下临界区的问题。1.一般做法的例子class ThreadA implements Runnable { private synchronized void test() throws InterruptedException {原创 2016-01-26 10:53:37 · 3410 阅读 · 2 评论 -
从头认识java-18.4 java多线程原子性操作里面的坑
这一章节我们来讨论一下java多线程原子性里面的坑。1.看似原子性操作:package com.ray.ch18;public class Test { private int a = 0; private int b = 0; public void methodA() { b = a + 1; } public int methodB() { return a;原创 2016-01-25 22:34:17 · 1769 阅读 · 0 评论 -
从头认识java-18.3 什么时候使用同步?
这一章节我们再次来讨论竞争条件的第一个方面:不正确的访问资源。我们上次以银行转账的例子说明了一下竞争条件,我们下面再引入另一个例子,再次说明竞争条件的形成。1.例子:package com.ray.ch18;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public cl原创 2016-01-25 22:07:37 · 2007 阅读 · 2 评论 -
从头认识java-18.2 基本的线程机制(8)多线程的异常捕捉
这一章节我们来讨论一下多线程的异常捕捉。1.普通情况的异常package com.ray.ch17;public class Test { public static void main(String[] args) { try { new ThreadA().run(); } catch (Exception e) { System.out.println("捕捉到异原创 2016-01-20 21:59:54 · 1533 阅读 · 0 评论 -
从头认识java-18.2 基本的线程机制(5)-守护线程与非守护线程
这一章节我们来讨论一下守护线程与非守护线程。1.什么是守护线程?什么是非守护线程?非守护线程:Java虚拟机在它所有非守护线程已经离开后自动离开。守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。2.相同点大家都是线程,其实可以互相切换3.不同点:退出的时间点退出的先后顺序:非守护线程->守护线程->jvm4.注意点:(1)设置守护线原创 2016-01-18 16:01:50 · 1390 阅读 · 0 评论 -
从头认识java-18.2 基本的线程机制(4)-优先级
这一章节我们来讨论一下多线程的优先级问题。1.例子:package com.ray.ch17;public class Test { public static void main(String[] args) { MyThead myThead = new MyThead(); MyThead2 myThead2 = new MyThead2(); for (int i =原创 2016-01-17 23:12:06 · 1585 阅读 · 0 评论 -
从头认识java-18.2 基本的线程机制(3)-线程的返回与sleep
这一章节我们来讨论一下线程的返回与sleep。1.线程的返回package com.ray.ch17;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Exe原创 2016-01-17 17:46:24 · 1757 阅读 · 0 评论 -
从头认识java-17.7 执行器(Executor)
这一章节我们来讨论一下Executor的第一个话题线程池。1.什么是线程池?(下面的解释来自http://baike.haosou.com/doc/2511076-2653416.html)线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空原创 2016-01-17 12:03:03 · 1614 阅读 · 0 评论 -
从头认识java-17.6 Callable、Future和FutureTask
这一章节我们来讨论一下Callable、Future和FutureTask的用法与关系。1.关系(1)Callable是Runnable的封装的异步运算任务(2)Future用来保存Callable异步运算的结果(3)FutureTask封装Future的实体类 2.Future我们在这里详细介绍一下Future,因为它比较复杂,首先看看他的源代码:public interface Future原创 2016-01-16 22:59:26 · 1817 阅读 · 1 评论 -
从头认识java-17.5 阻塞队列(以生产者消费者模式为例)
package com.ray.ch17;import java.util.concurrent.LinkedBlockingQueue;public class Test { public static void main(String[] args) { Basket basket = new Basket(); Thread thread1 = new Thread(ne原创 2016-01-16 07:49:11 · 1917 阅读 · 3 评论 -
从头认识java-17.4 详解同步(5)- 死锁
这一章节我们来简单讨论一下死锁,其实死锁是一个比较大的话题,但是我这里只是根据我前面的银行转账的例子来说明,在后面会有详细的专栏来说明并发编程的各个方面的问题。1.什么是死锁?是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。2.怎样会引起死锁?(1) 互斥条件:一个资源每次只能被一个进程使用;(2) 请求与保持条件:既拿原创 2016-01-15 11:31:55 · 1576 阅读 · 1 评论 -
从头认识java-17.4 详解同步(4)-同步阻塞、synchronized和volatile
这一章节我们来介绍同步阻塞、synchronized和volatile。1.同步阻塞之前我们提到过synchronized放在同步方法上:public synchronized void transfer(int fromAccount, int toAccount, double money) { if (accounts[fromAccount] < money) { r原创 2016-01-13 22:01:50 · 3106 阅读 · 0 评论 -
从头认识java-17.4 详解同步(3)-对象锁
这一章节我们接着上一章节的问题,给出一个解决方案:对象锁。1.什么是对象锁?对象锁是指Java为临界区synchronized(Object)语句指定的对象进行加锁,对象锁是独占排他锁。2.什么是临界区?临界区是指程序中的一个代码段,在这段代码中,单独并发的线程对同一个对象进行访问。在Java中,用关键字“synchronized”标识一个临界区。3.常用的对象锁:synchronized和Ree原创 2016-01-11 22:44:50 · 1757 阅读 · 3 评论 -
从头认识java-17.4 详解同步(2)-详解竞争条件
这一章节我们来详细讨论一下竞争条件。1.为什么会引起竞争条件?由于操作缺失原子性。2.什么是原子性?所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。3.分解上一章节转账的步骤:(1)读取某个账户的余额,对比提取的金额if (accounts[fromAccount] < money) { r原创 2016-01-11 17:33:40 · 1873 阅读 · 1 评论 -
从头认识java-17.4 详解同步(1)-由竞争条件引发的问题
这一章节我们来讨论一些同步的一些话题,由竞争条件引发的问题。1.什么是竞争条件?多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间,这种情形叫做竞争。竞争条件发生在当多个进程或者线程在读写数据时,其最终的的结果依赖于多个进程的指令执行顺序。举一个例子:我们平常编程经常遇到的修改某个字段,这个操作在库存那里尤为突出,当两个单子同时修改库存的时候,这时就形成了竞争条件,如果不做同步处理,原创 2016-01-11 14:39:55 · 2112 阅读 · 2 评论 -
从头认识java-17.3 线程状态
这一章节我们来讨论一下线程的状态。1.状态(1)新建状态(New):新创建了一个线程对象(2) 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。(3) 阻塞状态(Blocked):当任务想获取对象锁,但是该锁被其他任务持有,该任务的状态是阻塞状态;当持有锁对象释放锁,然后该任务持有锁,此时该原创 2016-01-11 11:02:09 · 1546 阅读 · 1 评论 -
从头认识java-17.2 线程中断(interrupt)
这一章节我们来讨论一下线程中断(interrupt)。1.什么是线程中断(interrupt)?就是在多线程运行的时候,我们给线程贴上一个中断的标记,但是不要求线程终止。 2.例子:中断的例子:package com.ray.ch17;public class Test2 { public static void main(String[] args) { PrintA prin原创 2016-01-10 16:21:16 · 1297 阅读 · 0 评论 -
从头认识java-17.1 多线程
这一章节我们来讨论一下多线程。1.什么是多线程?多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multi原创 2016-01-10 08:39:29 · 1469 阅读 · 1 评论 -
从头认识java-18.2 基本的线程机制(2)-Executors的使用
在前面的章节我们都是直接对Thread进行管理,我们这里解释一下另一个管理Thread的类Executors。1.例子:package com.ray.ch17;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.原创 2016-01-08 15:12:21 · 1528 阅读 · 1 评论 -
从头认识java-18.2 基本的线程机制(1)-再识多线程-2
接着上一个章节,我们这一章节介绍一下多线程的注意点。线程间执行的顺序和时间是不同的我们修改一下上一章节的代码:package com.ray.ch17;public class Test { public static void main(String[] args) { for (int i = 5; i < 8; i++) { DoneMission doneMission原创 2016-01-08 14:05:07 · 1387 阅读 · 0 评论 -
从头认识java-18.2 基本的线程机制(1)-再识多线程-1
这一章节我们来介绍一下Runnable。1.例子package com.ray.ch17;public class Test { public static void main(String[] args) { for (int i = 5; i < 8; i++) { DoneMission doneMission = new DoneMission(i); doneMi原创 2016-01-08 11:24:22 · 1294 阅读 · 0 评论 -
从头认识java-18.1 为什么需要并发?
这一章节我们来讨论一下为什么需要并发?答案如下:1.快先对比一下下面的两个例子:package com.ray.ch17;import java.util.ArrayList;public class Test { public static void main(String[] args) throws InterruptedException { long start原创 2016-01-07 21:27:23 · 1624 阅读 · 1 评论 -
从头认识java-16.6 ByteBuffer是怎样存储的?
这一章节我们来讨论一下ByteBuffer是怎样存储的?1.例子:package com.ray.ch16;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.IntBuffer;import java.nio.LongBuffer;publ原创 2016-01-07 11:02:06 · 1760 阅读 · 0 评论 -
从头认识java-16.5 nio的数据转换
这一章节我们来讨论一些nio的CharBuffer。上面一章节我们提到ByteBuffer,但是他是面向二进制数据,对于编程来说不是很方便,因此,java增加了转换数据的工具。1.例子package com.ray.ch16;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOExc原创 2016-01-06 22:48:32 · 1691 阅读 · 0 评论 -
从头认识java-16.4 nio的读与写(ByteBuffer的使用)
这一章节我们来讨论一下nio的读与写。1.nio的读package com.ray.ch16;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class Test { p原创 2016-01-06 09:25:20 · 1817 阅读 · 0 评论 -
从头认识java-16.3 IO的典型用法
解释:由于IO里面的InputStream,OutputStream这些api的用法比较简单,因此,暂时没有略过。这一章节主要介绍一下IO的典型用法。1.使用IO的时候推荐在外面包一层Bufferpackage com.ray.ch16;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.原创 2016-01-05 17:34:51 · 1676 阅读 · 0 评论 -
从头认识java-16.2 遍历文件夹
这一章节我们讨论一下遍历文件夹。1.通过递归遍历,遍历项目的根目录package com.ray.ch16;import java.io.File;public class Test { public static void showAllFiles(String path) { File root = new File(path); File[] files = root.li原创 2016-01-05 16:22:08 · 1506 阅读 · 0 评论 -
从头认识java-16.1 文件目录列表(File类的list())
这一章节我们来讨论一下文件目录列表,也复习一下以前的知识点。注意:这一章节需要一个文件夹,并在文件夹里面建立若干文件,具体怎么建立,就看自己的了。我的文件夹结构:-ch16|-Test|-Test.java|-Test0 - 副本|-Test2|-Test2 - 副本|-Test3|-Test3 - 副本|-Test_01.File类的list()方法这个方法的作用就是扫描某个目录下面的所有文件和原创 2016-01-05 15:34:42 · 1902 阅读 · 0 评论 -
从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap
这一章节我们来讨论一下Map两个比较常用的实现:TreeMap与LinkedHashMap。1.TreeMap特性:按照key来排序package com.ray.ch14;import java.util.Comparator;import java.util.TreeMap;public class Test { public static void main(String[] a原创 2016-01-04 22:40:51 · 1708 阅读 · 1 评论 -
从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法
接着上一章节,我们来讨论一下get方法。1.还是利用上一章节的图下图引用自:http://www.admin10000.com/document/3322.html2.get方法的源码:public V get(Object key) { if (key == null) return getForNullKey(); int hash =原创 2015-12-31 15:10:22 · 3104 阅读 · 1 评论 -
从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能
这一章节我们通过讨论装载因子与性能,再来介绍HashMap的工作原理。1.什么是装载因子?他有什么作用?下面的代码就是装载因子 /** * The load factor used when none specified in constructor. */ static final float DEFAULT_LOAD_FACTOR = 0.75f;作用:就是控制什么原创 2016-01-03 23:31:06 · 2895 阅读 · 0 评论 -
从头认识java-15.7 Map(5)-介绍HashMap的工作原理-Key变了,能不能get出原来的value?(偶尔作为面试题)
这一章节我们讨论一个比较特殊的情况Key变了,能不能get不出原来的value?答案是:有时可以,有时不可以1.可以的情况:package com.ray.ch14;import java.util.HashMap;public class Test { public static void main(String[] args) { HashMap map = new HashMa原创 2016-01-02 23:12:33 · 2035 阅读 · 0 评论 -
从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(经常作为面试题)
这一章节我们来讨论一下hash碰撞。1.什么是hash碰撞?就是两个对象的key的hashcode是一样的,这个时候怎么get他的value呢?答案是通过equals遍历table那个位置上面的Entry链表。2.例子正常的例子:package com.ray.ch14;import java.util.HashMap;public class Test { public static原创 2016-01-02 22:56:12 · 6671 阅读 · 1 评论 -
从头认识java-15.7 Map(2)-介绍HashMap的工作原理-put方法
这一章节我们来介绍HashMap的工作原理。1.HashMap的工作原理图下图引用自:http://www.admin10000.com/document/3322.html(1)HashMap初始化的时候我们可以这样理解:一个数组,每一个位置存储的是一个链表,链表里面的每一个元素才是我们记录的元素下面我们来看put的源码:public V put(K key, V value) {原创 2015-12-31 14:52:27 · 5889 阅读 · 0 评论 -
从头认识java-15.7 Map(1)-使用数组来简单模拟Map的创建
这一章节我们来使用数组模拟一下Map,了解一下Map的创建。1.Map是什么?Map,映射表,也叫关联数组,维护“键-值”的关联。2.使用数组模拟Mappackage com.ray.ch15;import java.util.HashSet;import java.util.Set;public class Test { public static void main(String[原创 2015-12-30 14:15:20 · 2568 阅读 · 0 评论