- 浏览: 16506 次
- 性别:
- 来自: 南京
最新评论
文章列表
package concurrency;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueCommunication {
public static void main(String[] args) {
final Business business = new Business();
new Thread(new Runnable() {
@Override
pub ...
重入
此锁允许 reader 和 writer 按照 ReentrantLock 的样式重新获取读取锁或写入锁。在写入线程保持的所有写入锁都已经释放后,才允许重入 reader 使用它们。
此外,writer 可以获取读取锁,但反过来则不成立。在其他应用程序中,当在调用或回调那些在读取锁状态下执行读取操作的方法期间保持写入锁时,重入很有用。如果 reader 试图获取写入锁,那么将永远不会获得成功。
锁降级
重入还允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的。这样会导致死锁。
如果锁 ...
参考原文:http://www.360doc.com/content/13/0502/23/7669533_282552666.shtml
JAVA类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手 ...
关于“==”
如果是原始类型,就是直接比较他们的值;
如果是引用类型,比较的就是引用的值。引用的值就是指对象的地址。也就是两个引用指向同一个对象,那么==比较返回true,否则false。
这里需要说明的一个问题是,关于Integer类中一个看起来奇怪的现象。
看int的包装类型Integer类:
Integer a = 20;
Integer b = 20;
Integer c = 200;
Integer d = 200;
int e = 200;
System.out.p ...
为什么wait 和notifyAll(notify) 必须要使用synchronized?
synchronized(object){
object.wait();
}
synchronized(this){
this.wait();
}
synchronized fun(){
this.wait();
}
如果不用在synchronized里面就会报错:
java.lang.IllegalMonitorStateException
首先明确wait 和notifyAll是基于对象而存在的。 ...
ssseeeee
import java.util.concurrent.locks.*;
import net.jcip.annotations.*;
/**
* ConditionBoundedBuffer
* <p/>
* Bounded buffer using explicit condition variables
*
* @author Brian Goetz and Tim Peierls
*/
@ThreadSafe
public class ConditionBoundedBuffer<T>
{
...
ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。当需要一些高级功能时才使用ReentrantLock,包括定时的锁等待,可中断的锁等待,公平性,锁绑定多个条件以及实现非块结构的加锁。否则,还是应该优先使用内置锁synchronized。synchronized是JVM的内置特性,可以进行一些优化。比如对线程封闭锁对象的锁消除优化,通过增加锁粒度来消除内置锁的同步等。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Ex ...
除了加锁外,其实还有一种方式可以防止并发修改异常,这就是读写分离技术(不是数据库上的)。
先回顾一下一个常识:
1、JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对 ...
1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
3. ServletContext. getResourceAsStream(String path):默 ...
如果要高效率的存贮大量开关信息,BitSet是很好的选择,不过它的效率是针对空间而言的;如果需要高效的访问时间,BitSet比本地数组稍慢一些。BitSet的最小容量是64位,如果存储的内容比较小,如8位。那么BitSet就浪费了一些空间。BitSet会随着元素的加入而扩充其容量。
以下示范BitSet是如何工作的。
package containers;
//: containers/Bits.java
// Demonstration of BitSet.
import java.util.*;
import static net.mindview.util.Prin ...
枚举类型进阶2:EnumMap演示命令设计模式
- 博客分类:
- 枚举类型
EnumMap是一种特殊的Map,它要求其中的键必须来自于一个enum。枚举映射在内部表示为数组。此表示形式非常紧凑且高效。枚举映射根据其键的自然顺序来维护(该顺序是声明枚举常量的顺序)。enum的每个实例作为一个键总是存在的,但是如果你没有为这个建调用put方法来存入相应的值,其对应值就是空。EnumMap 是不同步的。如果多个线程同时访问一个枚举映射,并且至少有一个线程修改该映射,则此枚举映射在外部应该是同步的。这一般通过对自然封装该枚举映射的某个对象进行同步来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap(java.util.Map) ...
对于enum而言,实现接口是其实现子类化的唯一办法。在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组,可以达到将枚举元素分类组织的目的。如下示例,用enum来表示不同类别的食物,但同时希望每个enum元素仍然保持Food类型。
package enumerated.menu;
import net.mindview.util.*;
public enum Meal2 {
APPETIZER(Food.Appetizer.class), MAINCOURSE(Food.MainCourse.class), DESSERT(
Food.Dessert ...
防止任务在共享资源上发生冲突的一种方式是根除对变量的共享。线程本地存储可以为使用相同变量的每个不同线程都创建不同存储。ThreadLocal该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
例如,以下类生成对每个线程唯一的局部标识符。线程 ID 是在第一次调用 UniqueThreadId ...