java
fei0724
这个作者很懒,什么都没留下…
展开
-
利用wait notify 实现线程互斥通知
public class TestWaitNotifyMutex {boolean isF1 = true;public static void main(String[] args) {final TestWaitNotifyMutex twnm = new TestWaitNotifyMutex();new Thread(){public void run()原创 2014-04-15 16:31:16 · 781 阅读 · 0 评论 -
利用阻塞队列进行互斥通知
public class TestBlockQueueMutex { static BlockingQueue bq1 = new LinkedBlockingQueue(1); static BlockingQueue bq2 = new LinkedBlockingQueue(1); public static void main(String[] args) { bq2.offe原创 2014-04-14 18:34:20 · 623 阅读 · 0 评论 -
同步中,为什么要wait,又notify谁?
JAVA只识别两种类型的锁:对象锁和类锁。对象锁与同步块或者实例同步方法相关系,但如果线程进入静态同步方法,就必须获得类锁。用锁只能达到这样的目的:使得一个任务不会干涉另一个任务的资源,保证在任何时刻都只有一个任务可以访问某个资源。但两个任务要协同作战,互相通信,要一起工作去解决某个问题,必须使他们友好握手、共商国事。这种机制靠Object的方法wait()和notify()来安全地实现。在Thr转载 2014-04-15 16:33:29 · 651 阅读 · 0 评论 -
Lock和synchronized
Lock和synchronized JDK1.5以后,在锁机制方面引入了新的锁-Lock,在网上的说法都比较笼统,结合网上的信息和我的理解这里做个总结。 java现有的锁机制有两种实现方式,J.DK1.4前是通过synchronized实现,JDK1.5后加入java.util.concurrent.locks包下的各种lock(以下简称Lock) 先说转载 2014-04-24 17:30:55 · 643 阅读 · 0 评论 -
Java分布式应用学习笔记06浅谈并发加锁机制分析
尊重原创,首先注明原作:Java分布式应用学习笔记06浅谈并发加锁机制分析转载 2014-04-25 20:48:01 · 598 阅读 · 0 评论 -
LRUCache和FastLRUCache实现分析
1、LRUCache的实现分析在分析LRUCache前先对LinkedHashMap做些介绍。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数public LinkedHashMap(int initialCapacity,float loadFactor, bool转载 2014-07-17 14:41:34 · 677 阅读 · 0 评论 -
android上的缓存、缓存算法和缓存框架
1.使用缓存的目的缓存是存取数据的临时地,因为取原始数据代价太大了,加了缓存,可以取得快些。缓存可以认为是原始数据的子集,它是从原始数据里复制出来的,并且为了能被取回,被加上了标志。在android开发中,经常要访问网络数据比如大量网络图片,如果每次需要同一张图片都去网络获取,这代价显然太大了。可以考虑设置本地文件缓存和内存缓存,存储从网络取得的数据;本地文件缓存空间并非是无限大的转载 2014-07-15 16:10:12 · 479 阅读 · 0 评论 -
缓存淘汰算法系列之1——LRU类
http://blog.csdn.net/yunhua_lee/article/details/75996711. LRU1.1. 原理LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。1.2. 实现最常见的实现是使用一个链表保存缓转载 2014-07-17 15:10:28 · 1586 阅读 · 0 评论 -
非阻塞同步机制与CAS操作
锁的劣势 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程 持有守护变量的锁,都采用独占的方式来访问这些变量,如果出现多个线程同时访问锁,那第一些线线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他 们的时间片以后才能被调度执行,在挂起和恢复执行过程中存在着很大的开销。锁还存在着其它转载 2014-06-11 16:28:33 · 793 阅读 · 0 评论 -
Java Concurrent包源码学习和使用心得 之 LinkedBlockingQueue源码解读
概述LinkedBlockingQueue是java concurrent包提供的另一个多线程安全的阻塞队列,与ArrayBlockingQueu相比,此队列的使用链表实现(不熟悉链表的同学,请查阅大学的数据结构课本),可以提供高效的并发读写性能。数据结构链表节点既然是链表,那么肯定少不了节点,节点自然包括节点内容和next指针。jdk开发人员,设计的节点是转载 2014-06-11 17:00:49 · 2641 阅读 · 0 评论 -
为什么在定义hashcode时要使用31这个数呢?
public int hashCode() { int h = hash; int len = count; if (h == 0 && len > 0) { int off = offset; char val[] = value; for (int i = 0; i h = 31*h + val[off++]; }转载 2014-05-29 20:16:55 · 702 阅读 · 0 评论 -
java的system.arraycopy()方法
java.lang.System的静态方法arraycopy()可以实现数组的复制,讲课的老师说这个方法效率比较高,如果数组有成千上万个元素,那么用这个方法,比用for语句循环快不少。于是我试了试,发现以下问题。 如果是复制一个一位数组,那么改变复制后的数组并不影响原数组。但是如果复制一个二维数组,那么改变其中任何一个数组,那么另一个的值也发生了变化。开始不是很明白,后来上网查了查资料,理转载 2014-06-12 11:43:38 · 768 阅读 · 0 评论 -
解释 hashCode 和hashCode算法
首先,想要明白hashCode的作用,你必须要先知道Java中的集合。 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是转载 2014-05-30 12:40:04 · 703 阅读 · 0 评论 -
newInstance() 的参数版本与无参数版本详解
通过反射创建新的类示例,有两种方式: Class.newInstance() Constructor.newInstance() 以下对两种调用方式给以比较说明: Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数; Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。 Class.newIn转载 2014-09-09 15:52:11 · 6199 阅读 · 0 评论 -
eclipse 导出 docs 乱码问题如何解决
-encoding UTF-8 -charset UTF-8原创 2014-12-04 14:28:04 · 563 阅读 · 0 评论 -
gson的@Expose注解和@SerializedName注解
1.使用@Expose可以区分实体中不想被序列化的属性@Expose标签的2个属性. 1.1 deserialize (boolean) 反序列化 默认 true 1.2 serialize (boolean) 序列化 默认 true 使用 new GsonBuilder().excludeFieldsWithoutExposeAnnotati转载 2015-01-31 17:01:57 · 6230 阅读 · 1 评论 -
利用观察者模式实现通知
public class TestObserverMutex {/*** @param args*/public static void main(String[] args) {System.out.println("start");ObservableA obsA = new ObservableA();obsA.addObserver(new Observ原创 2014-04-15 16:32:56 · 988 阅读 · 0 评论 -
HashMap实现原理分析
1. HashMap的数据结构数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;链表链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难转载 2014-03-18 11:10:46 · 580 阅读 · 0 评论 -
Java Volatile transient关键字
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个线程转载 2013-09-18 14:13:31 · 588 阅读 · 0 评论 -
Java中的transient,volatile和strictfp关键字
Java中的transient,volatile和strictfp关键字 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如: Java代码 class T { transient int a; //不需要维持 int b; //需要维持 } 这里,如果T类的一个对象写入一转载 2013-09-18 14:06:07 · 591 阅读 · 0 评论 -
java中volatile关键字在多线程中也存在的问题
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synch转载 2013-09-18 14:32:02 · 842 阅读 · 0 评论 -
受控异常 VS 非受控异常
受控异常:Checked Exception,这类异常必须写try{}catch{},或者throw抛出,否则编译通不过。非受控异常:Unchecked Exception,这类异常也叫做运行时异常(与非受控异常 字数相等),这类异常不需要try{}catch{},也不需要throw抛出,编译能通过。为什么要使用非受控异常?为了简化代码。试想一下,如果所有可能出现异常的地方(比如访问数组元转载 2013-11-28 10:26:29 · 2084 阅读 · 0 评论 -
如何用DOM生成和修改XML文件
我们一般都知道如何用DOM去读取XML文件的内容, DOM读取XML文件的时候会把整个XML文件映射到一棵内存树,如果通过DOM API中修改了这棵XML内存树,并不会反映到原XML文件,我们要想把修改或运行期间创建的XML内容保存到磁盘系统,可以用Transformer来实现。下面代码演示了该如何编程public class DOMTester { public static转载 2013-12-05 18:46:17 · 719 阅读 · 0 评论 -
Java 理论与实践: 正确使用 Volatile 变量
原文地址:http://www.ibm.com/developerworks/cn/java/j-jtp06197.htmlvolatile 变量使用指南Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出转载 2014-01-08 13:54:45 · 627 阅读 · 0 评论 -
Java多线程(五)之BlockingQueue深入分析
一、概述:BlockingQueue作为线程容器,可以为线程同步提供有力的保障。二、BlockingQueue定义的常用方法1.BlockingQueue定义的常用方法如下: 抛出异常特殊值阻塞超时插入add(e)offer(e)put(e)offer(e, time, unit)移转载 2014-01-08 11:13:15 · 728 阅读 · 0 评论 -
关于android webview js桥(addJavascriptInterface) 失效的问题
android webview中可以通过addJavascriptInterface将一个对象加入到webview中作为js方法供js调用,从而实现js与java的通信。但当程序被切入后台,后来启动的程序比较占内存,当webview被回收后,如果webView.setSaveEnabled(true);(默认是什么还没看),回收的时候会保存状态,如果再次启动的时候会带入所保存的状态,当调用js原创 2014-01-16 11:21:02 · 7813 阅读 · 0 评论 -
Lock与synchronized 的区别
1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定, 如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断 如果 使用ReentrantLock,如果A不释放,可以使B在转载 2014-01-20 10:12:00 · 661 阅读 · 0 评论 -
关于CAS与LOCK FREE(java lock synchronized)
最近又看到有人在搞LOCK FREE的东西,在群里问CAS是什么。CAS在我的理解就是下面这段代码{if( *pVal == oldVal ) { *pVal = newVal; return true;} return false;}当然,CAS把这段代码做成了一个原子操作。很多人看到这里,并不是十分理解,这个原子操作怎么去实现LOCK FREE。一般C转载 2014-01-20 15:53:47 · 2880 阅读 · 0 评论 -
无锁程序设计(CAS)
以下笔记主要来自:Coolshell - 无锁队列的实现。CAS操作所谓CAS指Compare and Set(或Compare and Swap)。现在几乎所有CPU指令都支持CAS,如X86的CMPXCHG汇编指令。CAS通常被视为无锁(lock free)数据结构的基础。CAS的C语言描述如下:int compare_and_swap(int* reg, int oldv, in转载 2014-01-20 16:00:06 · 3686 阅读 · 1 评论 -
java基础经典五十问
1、&和&&的区别。 答:&是位运算符,&&是布尔逻辑运算符。&也可用于逻辑运算,但是此时他不支持短路运算(即如果第一个变量的值为false,他还会判断第二个变量的bool值)2、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 答:Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11转载 2014-02-08 15:31:47 · 728 阅读 · 0 评论 -
请注意:java中没有引用传递
说明:本文的适用对象为java初学者、如果有读者发现文章中有叙述不妥之处,请指正。今天在论坛上有人提了一个关于java中调用函数时有没有引用传递的问题,可谓是吵的不可开交。有人说java只有值传递,也有人说java既有值传递也有引用传递,那么java中到底有没有引用传递呢,下面我来分析一下。一、首先来明确一下"值传递"和"引用传递的"区别值传递:是对所传递参数进行一次副本拷转载 2014-02-08 14:26:14 · 573 阅读 · 0 评论 -
String,StringBuffer,StringBuilder的一些区别
JAVA中String,StringBuffer,StringBuilder是有一些区别的;String主要应用在简单地保存一个字符串,逐步地遍历字符串,但其执行删除,修改,插入的操作时就有些麻烦;此时我们请出后两者,如StringBuffer,StringBuilder;说起后两者StringBuffer,StringBuilder主要在删除,修改,插入操作方面比String强,StringBu转载 2014-02-12 10:53:52 · 584 阅读 · 0 评论 -
TestConstruct(构造函数执行顺序及选择)
public class TestConstruct extends Parent{/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubTestConstruct tc = new TestConstruct("aaa");}原创 2014-02-12 11:44:34 · 781 阅读 · 0 评论 -
Java 初始化
public class Main extends MainClass{private final int radius = 1;private final int a;private Hello hello = new Hello(this);// private int radius = 1;Main(int i ){a =0;System.out.printl原创 2014-02-18 10:48:08 · 670 阅读 · 0 评论 -
全面分析Java的垃圾回收机制
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JV转载 2014-03-10 16:00:06 · 615 阅读 · 0 评论 -
Java的初始化机制、垃圾回收机制和内存分配机制
二.Java的初始化机制、垃圾回收机制和内存分配机制2.1初始化顺序:[java] view plaincopyprint?public class Parent { static Tipout TIP = new Tipout("父类 static 成员 TIP 初始化"); Tipout转载 2013-03-18 10:08:30 · 660 阅读 · 0 评论