09 2013 档案
摘要:怎样做到线程安全?1、不要跨线程共享变量;2、使状态变量为不可变的;3、或者在任何访问状态变量的时候使用同步同步synchronized//静态的synchronized方法从Class对象上获取锁synchronized(lock){ //访问或修改被锁保护的共享状态}当一个线程请求其他线程已经占用锁时,请求被阻塞,而锁是可以重进入的,因此线程在获取它自己占用的锁时,请求会成功,重进入意味着请求是基于每线程,而不是基于每调用。重进入方便锁行为封装,下面这个例子能很好理解重进入:public class Widget { public synchronized void doS...
阅读全文
摘要:一、Java 虚拟机运行时数据区域:1、方法区(Method Area)2、虚拟机栈(VM Stack)3、本地方法栈(Native Method Stack)4、堆(Heap)5、程序计数器(Program Couter Register)程序计数器(Program Couter Register):较小的内存空间,它的作用可以看做是当前线程所执行的字节码指示器。每个线程都有独立的程序计数器。(线程私有)虚拟机栈(VM Stack):Java方法执行的内存模型,每个方法被执行的时都会创建一个栈帧,存储局部变量,操作栈,动态链接,方法出口等,每个方法被调用至执行完成的过程对应一个栈帧在虚拟机栈
阅读全文
摘要:使用装饰者模式实现一个线程安全的Queue队列。public class SynchronizedQueue implements Queue, Serializable {private static final long serialVersionUID = -1439242290701194806L;private final Queue q; public SynchronizedQueue(Queue q) { this.q = q; } public synchronized boolean add(E e) { return q.add(e...
阅读全文
摘要:在开发中经常遇到数据类型转换的问题,大多数都是拿来强制转换,强制转换可能会出现你意想不到的问题:int a = -1;我们经过多重转换之后:int b = (int)(char)(byte) a ;System.out.println(b);预计结果还会是-1吗?打印结果:65535我们来分析下原因:Java使用基于2的补码的二进制运算,因此int类型的数值-1的所有32都是置位的;1、int——>byte 转型很简单,它执行了一个窄化原始类型转化,直接将除8位之外的所有位干掉,留下的是一个8位都被置位了的byte,它仍旧表示-1;2、byte——>char 因为byte是一个有符
阅读全文