Month: March 2013

以填酒、喝酒为例说明线程同步:阻塞、死锁、非阻塞、Notify/Wait机制

一个填酒线程,一个喝酒线程对一个酒杯轮流进行操作。 阻塞、死锁 package player.kent.chen.learn.threads.notify; /** * 酒杯 * * @author kent 2013-3-11下午4:34:30 */ public class Cup { private volatile boolean empty = true; /** * 填酒,阻塞式地 * * @author kent 2013-3-11下午4:59:33 */ public synchronized void fill() { while (!empty) { //若酒杯不为空则等待 ; } doFill(); } /** * 清空酒杯,阻塞式地 * * @author kent 2013-3-11下午4:59:50 */ public …

以填酒、喝酒为例说明线程同步:阻塞、死锁、非阻塞、Notify/Wait机制 Read More »

代码示例:java.util.concurrent.locks.Lock

import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author kent 2013-3-11上午11:55:28 */ public class PlayLock implements Runnable { private Bean bean; public PlayLock(Bean bean) { super(); this.bean = bean; } public void run() { for (int j = 0; j < 100; j++) { bean.increment(); } } private static final class Bean { private int i = …

代码示例:java.util.concurrent.locks.Lock Read More »

小结:预发布测试时如何隔离生产环境的应用

对系统进行预发布测试时,应该保证不会触碰到生产环境中系统的应用,否则你测的对象就不是预发服务器了。 1.用浏览器访问预发web应用:   通过改写浏览器端hosts,把正式域名指向预发服务器。 2.一个预发系统以RPC方式调用另一个预发系统:   如果有注册中心、有服务发现机制,则可以让RPC服务提供者以特殊的版本号在预发环境发布,服务使用者在预发环境用这个版本号访问它。   如果没有服务发现机制,就把服务提供者的预发环境IP告诉服务使用者 3.一个预发系统发异步消息给另一个预发系统:   预发系统搭建自己的消息中间件服务器   4.期望测试时造的数据只被预发的task (如quartz) 访问到     这个比较难,因为预发系统和生产环境一般共享同一套数据库,预发环境造的数据也会被生产环境的task访问到。这时一般要在表里为预发用的数据专门开设一个标志位字段,如果有多张表,可能每张表都需要这样的字段;再在应用代码里判断当前数据是否是预发数据;这种做法很繁琐,而且直接侵入了系统。

JAVA虚拟机内存结构与物理机器进程内存结构的对应

JAVA虚拟机是一台“计算机”,它的内存结构跟物理机进程的内存结构有点类似: PC Register: 相当于普通进程中Text段中的PC值 VM Stack: 相当于普通进程中的Stack Heap:     相当于普通进程中的Heap Method Area:   相当于普通进程中的Text段(指令), 和Static Data(常量、静态变量) 以上对应关系都是模糊的,只是让你对JVM内存结构有个感性的认识

如何让virtualbox的主机能访问宿机,宿机又能访问主机所在局域网?

如何让virtualbox的主机能访问宿机,宿机又能访问主机所在局域网? 答案是在virtualbox里配置两块网卡:   1. 配一个Host-Only方式,这样主机就能访问宿机   2. 再配一个NAT方式,这样宿机就能访问主机所在局域网 (还要在虚拟机里把DNS配的跟主机使用的DNS一样,否则无法用域名访问主机所在局域网里的服务器)