11 2017 档案
简单的数据库连接示例 基于等待超时模式
摘要:描述:使用等待超时模式来构造一个简单的数据库连接池,在示例中模拟从连接池中获取、使用和释放连接的过程。客户端获取连接的过程被设计成等待超时模式 输出结果: 阅读全文
posted @ 2017-11-27 22:31 飞奔的菜鸟 阅读(420) 评论(0) 推荐(0)
线程的等待超时模式
摘要:1 //对当前对象加锁 2 public synchronized Object get(long mills) throws InterruptedException{ 3 long future = System.currentTimeMillis() + mills; 4 long remaining = mills; 5 ... 阅读全文
posted @ 2017-11-27 21:15 飞奔的菜鸟 阅读(234) 评论(0) 推荐(0)
ThreadLocal
摘要:ThreadLocal,线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。例如: Profiler可以用来计算方法的耗时,在方法之前调用begin,方法之后调用end 阅读全文
posted @ 2017-11-26 22:49 飞奔的菜鸟 阅读(202) 评论(0) 推荐(0)
Java join()
摘要:如果一个线程A执行了thread.join()语句,其含义是:当前线程A等待thread线程终结之后才从thread.join()返回,继续执行。 阅读全文
posted @ 2017-11-26 22:39 飞奔的菜鸟 阅读(243) 评论(0) 推荐(0)
Java wait
摘要:调用该方法的线程进入等待状态,只有等待另外线程的通知或被中断才会返回。 注意:调用wait()方法之后,会释放对象锁。 阅读全文
posted @ 2017-11-26 21:56 飞奔的菜鸟 阅读(149) 评论(0) 推荐(0)
安全终止线程
摘要:中断操作是一种简便的线程间交互的方式,这种交互方式最适合用来取消或者停止任务。除了中断外,还能利用一个boolean变量来控制是否需要停止并终止该线程。例如: 阅读全文
posted @ 2017-11-26 21:41 飞奔的菜鸟 阅读(192) 评论(0) 推荐(0)
suspend方法 stop方法
摘要:在调用suspend()方法之后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易死锁。同样stop()方法在终结一个线程时不会保证线程的资源正确释放,通常是没有给予线程完成资源释放工作的机会,会导致程序可能工作在不确定状态下。 阅读全文
posted @ 2017-11-26 21:17 飞奔的菜鸟 阅读(347) 评论(0) 推荐(0)
Java 中断
摘要:许多方法声明抛出InterruptedException(例如Thread.sleep()),这些方法在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException,此时调用isInterrupted()方法将会返回f 阅读全文
posted @ 2017-11-25 16:31 飞奔的菜鸟 阅读(159) 评论(0) 推荐(0)
Daemon线程
摘要:Daemon线程是一种支持型线程,主要被用作程序中后台调度以及支持性工作。就是说,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出,此时Java虚拟机中的所有Daemon线程都需要立即终止。可以通过调用Thread.setDaemon(true)将线程设为Daemon线程 阅读全文
posted @ 2017-11-25 15:09 飞奔的菜鸟 阅读(456) 评论(0) 推荐(0)
双重检查锁定的缺点与改进
摘要:双重检查锁定的延时初始化: 双重检查锁定看起来似乎很完美,但这是一个错误的优化!执行程序读取到第5行instance不为空时,instance引用的对象可能还没有完成初始化。 程序第8行所做的操作如下: 1:分配对象的内存空间 2:初始化对象 3:设置instance指向刚分配的内存地址 步骤2和3 阅读全文
posted @ 2017-11-23 21:11 飞奔的菜鸟 阅读(391) 评论(0) 推荐(0)
intra-thread semantics
摘要:intra-thread semantics 保证重排序不会改变单线程内的程序执行结果。 换句话说,intra-thread semantics 允许那些在单线程内,不会改变单线程程序执行结果的重排序。 阅读全文
posted @ 2017-11-23 20:41 飞奔的菜鸟 阅读(904) 评论(0) 推荐(1)
final域的内存语义
摘要:对于final域,编译器和处理器要遵守两个重要的重排序规则: 1:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2:初次读一个包含final域的对象的引用,与随后初次都这个final域,这两个操作之间不能重排序。 对于引用类型。写f 阅读全文
posted @ 2017-11-23 19:55 飞奔的菜鸟 阅读(188) 评论(0) 推荐(0)
volatile 的内存语义
摘要:理解volatile特性的一个好方法是吧对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。 即使是64位的long型和double型变量,只要它是volatile变量,对这些变量的读/写就具有原子性。 如果是多个volatile操作或类似于volatile++这种复 阅读全文
posted @ 2017-11-22 22:58 飞奔的菜鸟 阅读(229) 评论(0) 推荐(0)
总线事务
摘要:每次处理器和内存之间的数据传递都是通过一系列步骤来完成的,这一系列步骤称之为总线事务。 总线事务包括读事务和写事务。 阅读全文
posted @ 2017-11-22 20:53 飞奔的菜鸟 阅读(1133) 评论(0) 推荐(0)
as-if-seral
摘要:as-if-seral的语义是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。 为了遵守as-if-seral语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。 在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果( 阅读全文
posted @ 2017-11-22 20:24 飞奔的菜鸟 阅读(191) 评论(0) 推荐(0)
happens—before
摘要:每个处理器上的写缓冲区,仅仅对它所在的处理器可见。 Java语言中有一个“先行发生”(happens—before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,“影响”包括修改了内存中共享 阅读全文
posted @ 2017-11-21 23:07 飞奔的菜鸟 阅读(213) 评论(0) 推荐(0)
重排序
摘要:为了提高性能,编译器和处理器通常会对指令做重排序。重排序分为3中类型: 1:编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2:指令级优化的重排序。 3:内存系统的重排序。 阅读全文
posted @ 2017-11-21 22:48 飞奔的菜鸟 阅读(175) 评论(0) 推荐(0)
线程通信 和 同步
摘要:线程之间的通信机制有两种:共享内存和消息传递。 同步是指程序中用于控制不同线程间操作发生相对顺序的机制。 在共享内存的并发模型里,通信是隐式进行的,同步时显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。 在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐 阅读全文
posted @ 2017-11-21 22:43 飞奔的菜鸟 阅读(234) 评论(0) 推荐(0)
总线锁 缓存锁
摘要:总线锁:就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。 缓存锁:所谓“缓存锁定”是指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上声言LOCK#信 阅读全文
posted @ 2017-11-20 22:52 飞奔的菜鸟 阅读(4792) 评论(0) 推荐(0)
偏向锁
摘要:大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入偏向锁。 当一个线程访问同步代码块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程再进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需要简单地测试一下对象头的Mark Wo 阅读全文
posted @ 2017-11-20 22:31 飞奔的菜鸟 阅读(2470) 评论(0) 推荐(0)
Java 锁
摘要:Java中的每一个对象都可以作为锁,具体表现为一下三种形式: 1:对于普通同步方法,锁是当前实例对象。 2:对于静态同步方法,锁是当前类的Class对象。 3:对于同步方法块,锁是Synchronized括号里配置的对象。 阅读全文
posted @ 2017-11-20 22:11 飞奔的菜鸟 阅读(182) 评论(0) 推荐(0)
transient
摘要:一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。 然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性 阅读全文
posted @ 2017-11-20 21:44 飞奔的菜鸟 阅读(160) 评论(0) 推荐(0)