2014年9月

隔离级别中,很容易弄混的就是这两种了:read committed(提交读)和repeatable read(可重复读)。
两者的概述:
1、read commited:事务执行中,别人committed的数据,它能立即看到。增删改都可见。
2、repeatable read:事务执行中,别人也在事务执行中的增删它也能看到,别人的的修改它看不到。

- 阅读剩余部分 -

ReentrantLock内部用到了AbstractQueuedSynchronizer(也就是AQS),而AbstractQueuedSynchronizer是AbstractOwnableSynchronizer(先简称AOS吧)的子类。
翻AOS的源码,发现其本身就像是个ThreadHolder,表示当前被哪个线程占用。

疑问是这个线程的定义有问题
[code]
/**
* The current owner of exclusive mode synchronization.
*/
private transient Thread exclusiveOwnerThread;
[/code]
AQS专为并发设计的,所以第一反应就是线程安全,觉得这个Thread的定义仅有transient(不序列化),而没有volatile。
比起AQS里清一色的volatile,AOS里的这个Thread的定义没有volatile的原因,我一直没弄明白。

先上一个例子,目的是输出一百次condition.await() wake up,代码如下
[code]
final ReentrantLock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
Thread th = new Thread(new Runnable() {

@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 100; i++) {
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
}
});
th.start();
for (int i = 0; i < 100; i++) {
lock.lock();
try {
condition.await();
System.out.println("condition.await() wake up " + i);
} finally {
lock.unlock();
}
}
System.out.println("done!");
[/code]

- 阅读剩余部分 -

Java线程的阻塞状态,共有三种:BLOCKED, WAITING, TIMED_WAITING
对于导致这三种状态的成因,源码里有明确的说明。
[code]
/**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED,
[/code]
简述:BLOCKED就是等待进入synchronized块或wait被唤醒后返回synchronized块时的等待。

- 阅读剩余部分 -