09 2011 档案
摘要:1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 3. Java中的数据类型有两种。 一种是基本类型(primitive types), 共有8种,即int, short,
阅读全文
摘要:Java中的内存由java虚拟机自己管理,区别于C++的程序手动释放。Java的内存可以笼统的分为数据堆(Heap)和栈(Stack)两个部分。程序在运行的时候一般分配数据推,把局部的临时变量都放进去,生命周期和进程有关。如果声明了static的变量,就直接在stack中运行,进程销毁后,不一定销毁static变量。为了保证Java内存不会溢出,Java中有垃圾回收机制。System.gc()即垃圾收集机制,是指JVM用于释放那些不再使用的对象所占用的内存。垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。内存溢出是指,你申请分配的JAVA虚拟机内存
阅读全文
摘要:如果线程A将对象X置入某个线程安全器,随后线程B重新获得X,这时可以保证B看到的X的状态,一定正是A设置的。 为了安全的发布对象,对象的引用以及对象的状态必须同时对其他线程可见。 1、通过静态初始化器初始化对象的引用; 2、将它的引用存储到volatile域活AtomicReference; 3、将它的引用存储到正确创建的对象的final域中; 4、将它的引用存储到由锁正确保护的域中。 以下情况符合安全发布: 1、置入Hashtable、synchronizedMap、ConcurrentMap中的主键以及键值,会安全地发布到可以从Map获得它们的任意线程中,无论是直...
阅读全文
摘要:创建后状态不能被修改的对象叫做不可变对象。不可变对象天生就是线程安全的,可以放心的共享与发布,不需要创建防御性拷贝。 可变对象传递给不可信的代码,或者将它发布到不可信代码可以找到的地方,都是危险的,有可能被改变状态或者会保留引用并在其他线程中修改状态。 不可变性并不简单地等于将对象中的所有域都声明为final类型,所有域都是final类型的对象依旧可以是可变的,因为final域可以获得一个可变对象的引用。
阅读全文
摘要:栈限制(也称线程内部或者线程本地用法)是线程限制的一种特例,在栈限制中,只能通过本地变量才可以触及对象。正如封装使不变约束更容易被保持,本地变量使对象更容易被限制在线程本地中。本地变量本身就被限制在执行线程中;它们存在于执行线程栈。其他线程无法访问这个栈。public int loadTheArk(Collection<Animal> candidates) { SortedSet<Animal> animals; int numPairs = 0; Animal candidate = null; // animals被限制在方法中,不要让它们溢出 an...
阅读全文
摘要:当一个域声明为volatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。所以读一个volatile类型的变量时,总会返回由某一线程写入的最新值。但是只有在满足了以下的标准后,才能使用volatile变量:1、写入变量时并不依赖变量的当前值;或者能够确保只有单一的线程修改变量的值。2、变量不需要与其他的状态变量共同参与不变约束3、访问变量时,没有其他的原因需要加锁
阅读全文
浙公网安备 33010602011771号