??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
郁闷Q?br>极其郁闷Q!Q?br>
改变Q?br>要改变啊Q!
static InvocationHandler | getInvocationHandler(Object proxy) q回指定代理实例的调用处理程序?/td> |
static Class<?> | getProxyClass(ClassLoader loader, Class<?>... interfaces) q回代理cȝ java.lang.Class 对象Qƈ向其提供cd载器和接口数l?/td> |
static boolean | isProxyClass(Class<?> cl) 当且仅当指定的类通过 getProxyClass Ҏ?newProxyInstance Ҏ动态生成ؓ代理cLQ返?true?/td> |
static Object | newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) q回一个指定接口的代理cd例,该接口可以将Ҏ调用指派到指定的调用处理E序?/td> |
没时间了Q先q样吧?br />
2.
U程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', ?'Waiting'几个状态,
'Ready' 表示U程正在{待CPU分配允许q行的时间?/p>
3. U程q行ơ序q不是按照我们创Z们时的顺序来q行的,CPU处理U程的顺序是不确定的Q如果需要确定,那么必须手工介入Q用setPriority()Ҏ讄优先U?/p>
4. 我们无从知道一个线E什么时候运行,两个或多个线E在讉K同一个资源时Q需要synchronized
5. 每个U程会注册自己,实际某处存在着对它的引用,因此Q垃圑֛收机制对它就“束手无{”了?/p>
6. DaemonU程区别一般线E之处是Q主E序一旦结束,DaemonU程׃l束?/p>
7. 一个对象中的所有synchronizedҎ都共享一把锁Q这把锁能够防止多个Ҏ寚w用内存同时q行的写操作。synchronized staticҎ可在一个类范围内被怺间锁定v来?/p>
8. 对于讉K某个关键׃n资源的所有方法,都必L它们设ؓsynchronizedQ否则就不能正常工作?/p>
9. 假设已知一个方法不会造成冲突Q最明智的方法是不要使用synchronizedQ能提高些性能?/p>
10 . 如果一?同步"Ҏ修改了一个变量,而我们的Ҏ要用到这个变?可能是只?,最好将自己的这个方法也设ؓ synchronized?/p>
11. synchronized不能l承Q 父类的方法是synchronizedQ那么其子类重蝲Ҏ中就不会l承“同步”?/p>
12. U程堵塞Blocked有几个原因造成Q?/p>
(1)U程在等候一些IO操作
(2)U程试图调用另外一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用?/p>
13.
原子型操?atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着q些操作是线E安全的Q?但是大部分情况下Q我们ƈ不能正确使用Q来看看 i = i + 1 , i是int型,属于原始型变量:
(1)从主内存中读取i值到本地内存.
(2)g本地内存装蝲到线E工作拷贝中.
(3)装蝲变量1.
(4)i ?1.
(5)结果给变量i.
(6)i保存到线E本地工作拷贝中.
(7)写回d?
注意原子型操作只限于W?步到W?步的d以及W?到第7步的? i的D是可能被同时执行i=i+1的多U程中断打扰(在第4??/p>
double 和long 变量是非原子型的(non-atomic)。数l是object 非原子型?br />
14. ׃13条的原因Q我们解军_法是Q?/p>
class xxx extends Thread{
//i会被l常修改
private int i;
public synchronized int read(){ return i;}
public synchronized void update(){ i = i + 1;}
..........
}
15. Volatile变量Q?volatile变量表示保证它必L与主内存保持一_它实际是"变量的同?, 也就是说对于volatile变量的操作是原子型的Q如用在long ?double变量前?br />
16. 使用yield()会自动放弃CPUQ有时比sleep更能提升性能?/p>
17. sleep()和wait()的区别是Qwait()Ҏ被调用时会解除锁定,但是我们能用它的地方只是在一个同步的Ҏ或代码块内?/p>
18. 通过刉羃同步范_可能的实现代码块同步,wait(毫秒?可在指定的毫U数可退出waitQ对于wait()需要被notisfy()或notifyAll()t醒?/p>
19.
构造两个线E之间实旉信的方法分几步Q?br />(1). 创徏一个PipedWriter和一个PipedReader和它们之间的道;
PipedReader in = new PipedReader(new PipedWriter())
(2). 在需要发送信息的U程开始之前,外部的PipedWriter导向l其内部的Writer实例out
(3). 在需要接受信息的U程开始之前,外部的PipedReader导向l其内部的Reader实例in
(4). q样攑օout的所有东西度可从in中提取出来?/p>
20. synchronized带来的问题除性能有所下降外,最大的~点是会带来死锁DeadLockQ只有通过谨慎设计来防止死锁,其他毫无办法Q这也是U程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()Ҏ
21. 在大量线E被堵塞Ӟ最高优先的线E先q行。但是不表示低别线E不会运行,q行概率而已?/p>
22. U程l的主要优点是:使用单个命o可完成对整个U程l的操作。很需要用到线E组?/p>
23. 从以下几个方面提升多U程的性能Q?/p>
查所有可能Block的地方,可能的多的使用sleep或yield()以及wait();
可能g长sleep(毫秒?的时?
q行的线E不用超q?00个,不能太多Q?/p>
不同q_linux或windows以及不同JVMq行性能差别很大?/p>
24. 推荐几篇相关英文文章:
Use Threading Tricks to Improve Programs
原文Q多U程设计要点 板桥里h http://www.jdon.com/concurrent/thread.htm
一般情况下Q某一数据库无法知道其它数据库在做什么,因此Q在一个DTP环境中,交易中间件是必需的,由它通知和协调相x据库的提交或回滚。而一个数据库只将其自己所做的操作Q可恢复Q媄到全局事务中。?br />
XA是X/Open DTP定义的交易中间g与数据库之间的接口规范(x口函敎ͼQ交易中间g用它来通知数据库事务的开始、结束以及提交、回滚等。XA接口函数由数据库厂商提供?
通常情况下,交易中间件与数据库通过XA 接口规范Q用两阶段提交来完成一个全局事务QXA规范的基是两阶段提交协议。?br />
在第一阶段Q交易中间gh所有相x据库准备提交Q预提交Q各自的事务分支Q以认是否所有相x据库都可以提交各自的事务分支。当某一数据库收到预提交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来Qƈl交易中间g一个同意提交的应答Q此时数据库不能再在该事务分支中加入Q何操作,但此时数据库q没有真正提交该事务Q数据库对共享资源的操作q未释放Q处于上锁状态)。如果由于某U原因数据库无法提交属于自己的事务分支,它将回滚自己的所有操作,释放对共享资源上的锁Qƈq回l交易中间gp|应答?
在第二阶D,交易中间件审查所有数据库q回的预提交l果Q如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,q样该全局事务被提交。而如果有M数据库预提交q回p|Q交易中间g要求所有其它数据库回滚其操作,q样该全局事务被回滚?br />
摘自http://www.huihoo.com/middleware/trade_middleware.html 交易中间件与XA规范