- 博客(29)
- 收藏
- 关注
原创 java多线程(五)中断 interrupt、interrupted 、isInterrupted
java多线程之中断: (1) Thread.stop(), Thread.suspend(), Thread.resume() 和Runtime.runFinalizersOnExit() 这些终止线程运行的方法 。这些方法已经被废弃,使用它们是极端不安全的。 (2) Thread.interrupt() 方法是很好的选择。下面详细解释一下这三个方法:一:interrupt(
2017-08-24 16:31:55
418
转载 java多线程之死锁
前言死锁单独写一篇文章是因为这是一个很严重的、必须要引起重视的问题。这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只要在这数十亿次操作中只要有一次发生了错误,就可能导致程序中发生死锁,并且即使通过压力测试也不可能找出所有潜在的死锁。 死锁一个经典的多线程问题。当一个线程永远地持有
2017-08-24 15:53:01
378
原创 java多线程(四)wait() notify() notifyall()
wait()、notify()和notifyAll()是Object类中的方法(必须写在Synchronized里面) 1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁),调用后将会出让该锁。 3)调用某
2017-08-24 15:34:31
281
转载 Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
1 引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。2 术语定义术语英文说明
2017-08-24 14:51:00
405
原创 java多线程(三)Synchronized
一、Synchronized 使用多线程的情况下对共享变量的访问必须进行同步处理,否则会出现意想不到的结果。Synchronized关键字就是进行多线程同步用的。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法: (1)修饰普通方法
2017-08-24 14:27:53
330
原创 java线程(二)Thread类
一:静态方法●Thread.currentThread()返回的是对当前正在执行线程对象的引用。线程类的构造方法、静态块是被main线程调用的,而线程类的run()方法才是应用线程自己调用的。this是线程自己,不是main。package chin.tei.thread;public class TestThread { public static void main
2017-08-23 16:34:26
360
原创 java线程一(基础)
一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认为java.exe或者javaw.exe(windows下可以通过任务管理器查看)。Java采用的是单线程编程模型,即在我们自己的程序中如果没有主动创建线程的话,只会创建一个线程,通常称为主线程。但是要注意,虽然只有一个线程来执行任务,不代表JVM中只有一
2017-08-23 14:54:14
272
转载 使用 IoC 反转控制的三种设计模式
对于许多开发人员来说,控制反演(IoC)都是一个模糊的概念,因为他们在现实世界中很少或没有被应用过。在最好的情况下,控制反演(IoC)可以加单的认为是等效于依赖注入(DI)。实际上,只有在翻转控制与依赖注入双方都只是反映翻转依赖管理控制的时候,才认为两者是等效的。虽然,依赖注入实际上是IoC的一种众所周知的形式。但是,事实上IoC却是一个相对更为广泛的软件设计范例,可以通过多种模式来进行实现。在本
2017-08-21 17:02:10
314
转载 java之volatile关键字
一.内存模型的相关概念计算机有CPU和内存,硬盘,运行速度上CPU>内存>硬盘,所以在内存和CPU间加了一个CPU寄存器高速缓存。每个CPU每次都是先从主存中读取值放到高速缓存中,当要计算时从高速缓存中读入,算完后,再把高速缓存的值写入主存。这样多CPU的场合就会产生缓存不一致问题。为了解决缓存不一致性问题,通常来说有以下2种解决方法: 1)通过在
2017-08-18 16:49:20
426
原创 java集合之4种Reference
public abstract class Reference {public class SoftReference extends Reference {public class WeakReference extends Reference {public class PhantomReference extends Reference {可以用以下表格总
2017-08-18 15:57:15
385
原创 java并发之ThreadLocal
概要:ThreadLocal一般被定义成private static的,这样的话,对于多线程还是web程序来说,在当前线程的任意阶段都可以操作(操作的是自己的局部变量,于其它线程是隔离的)。设计原理:1,Thread.java中保持了一个成员变量mapThreadLocal.ThreadLocalMap threadLocals = null;2,ThreadLoc
2017-08-17 16:46:17
312
原创 java集合之PriorityQueue
概要:PriorityQueue是优先队列,通过自然顺序或者指定的顺序来实现队列的头部是最小元素的集合。(简单说就是小优先)。*不允许放入NULL,其实Queue接口的实现都不应该放入NULL,因为这个接口总有一对方法,失败时一个error,一个返回false或NULL,所以为了避免到底是null元素还是操作失败的区分,不应该放入NULL。实现原理:其通过堆实现,具体说是通
2017-08-17 16:04:43
327
原创 java实现时间复杂度O(1)的LFU缓存
LFU缓存一般需要排序来解决命中率问题(上一篇的LFU实现也是利用了Collections.sort),导致时间复杂度较高。下面采用一种算法让LFU的时间复杂度成为O(1)。数据设计:1,一个双向链表来保存命中数(下面代码的NodeCount countHead,结构中包含2的map)。2,命中数相同的放在一个双向链表的map中(这里用的是LinkedHashMap,主要是利用
2017-08-17 10:44:24
1267
原创 java几种缓存的简单实现
1,先进先出FIFOpackage chin.tei.fifo;import java.util.LinkedHashMap;public class CacheFIFO extends LinkedHashMap{ private static final long serialVersionUID = -1942463383036528618L; private fina
2017-08-16 14:54:57
715
原创 java finally return
执行顺序:①先执行return操作②确定返回值,但是此时并不会立刻返回。(如果返回值是非引用类型(int等),即使在finally改值也没用,也只会返回第一步中计算出来的返回值。)③执行finally中的操作(如果该finally操作中也包含有return操作则会直接返回,也就是说正常的return会被finally的return覆盖)④finally里面的内容执行完了,程序则会返
2017-08-15 16:23:29
367
原创 java集合之LinkedHashMap
概要:LinkedHashMap继承HashMap,但是添加了双向链表来保存元素的顺序。LinkedHashMap重写了三个回调方法和两个newNode方法来处理双向链表的添加和修改。// Callbacks to allow LinkedHashMap post-actions void afterNodeAccess(Node p) { } void afterNode
2017-08-15 14:18:11
298
原创 java集合之HashMap的扩容resize
JDK1.7中,resize时,index取得时,全部采用重新hash的方式进行了。JDK1.8对这个进行了改善。以前要确定index的时候用的是(e.hash & oldCap-1),是取模取余,而这里用到的是(e.hash & oldCap),它有两种结果,一个是0,一个是oldCap,比如oldCap=8,hash是3,11,19,27时,(e.hash & oldCap)的结果
2017-08-14 17:44:36
5726
1
原创 java集合之HashMap
概要:底层实现为数组(transient Node[] table),当发生hash碰撞时,以单链表的形式保存,但在1.8后,当table大小超过64,链表长度大于8时,会把链表转成红黑树来保存。否则进行扩容处理。当进行remove操作是,如果红黑树的大小小于6,就会把红黑树转成单链表。8-6差2,这个空隙为了避免频繁的进行转换。所以1.8以后的HashMap里面是单链表和红黑树混合形式。
2017-08-14 17:05:37
234
原创 java集合之hashMap的hash原理
JDK1.8中的HashMap的hash原理:分为两步:1,hash()计算static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }2,index计算index = (tab.len
2017-08-14 16:34:03
370
原创 java集合之TreeMap
概要:底层实现为红黑树(BR-Tree),也就意味着containsKey(), get(), put(), remove()都有着log(n)的时间复杂度,没有路径能多于任何其他路径的两倍长。【成员变量:Entry root】性质1. 节点是红色或黑色。性质2. 根节点是黑色。性质3 每个叶节点(NIL节点,空节点)是黑色的。性质4 每个红色节点的两个子节
2017-08-13 11:07:50
313
原创 java集合之ArrayDeque
概要底层实现是数组elements,通过head和tail来实现循环数组。数组大小每次扩大2倍,所以2的指数倍。(tail是最后一个元素的下一个空元素的下标,是可以直接插入的,也就是数组始终有一个空的,所以下面的操作都是先赋值再扩容的)取莫操作(head - 1) & (elements.length - 1)(tail + 1) & (elements.length - 1)
2017-08-12 19:58:32
426
原创 java集合之LinkedList
概要:底层实现为双向链表,改易查难。1,Classpublic class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable2,成员变量(只有first和last,所以只能根据index1/2用last一个一个查找
2017-08-12 16:36:33
669
原创 java 位运算
Java提供的位运算符有:左移( > ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。1、左移( Test1、将5左移2位:[java] view plain copypackage com.xcy;
2017-08-11 18:25:15
273
原创 JAVA集合之ArrayList
概要:底层是一个Object数组来实现的,初始大小10,每次1.5倍。1,类public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable2,成员变量 private static fi
2017-08-11 16:51:11
330
原创 java集合(一)总图
总结 单线程并发ListsArrayList——基于泛型数组LinkedList——不推荐使用Vector——已废弃(deprecated)CopyOnWriteArrayList——几乎不更新,常用来遍历Queues / dequesArrayDeque——基于泛型数组Stac
2017-08-10 16:38:50
458
原创 String StringBuilder StringBuffer
String1,final不可变的2,重写equals方法 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { Stri
2017-08-08 17:05:46
186
原创 java泛型
package java.generic;public class Generic { private K key; private V value; public Generic() { } public Generic(K key, V value) { this.key = key; this.value = value; } public
2017-08-08 15:24:50
328
原创 super()和this()方法
用法:1,用在类的构造方法中;2,必须写在构造方法的第一行;(因为类必须构造完成后才能进行其他操作)3,不可以在一个构造方法中同时使用;(如果同时使用的话,this()会调用父类的构造方法,和super()冲突,会)super():表示调用父类的构造方法this():表示条用本类的其他构造方法
2017-08-08 11:25:49
284
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人