存档

2014年9月 的存档

提交读和可重复读两种隔离级别

2014年9月29日 没有评论

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

更多内容…

AbstractOwnableSynchronizer的疑问

2014年9月26日 没有评论

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

疑问是这个线程的定义有问题

    /**
     * The current owner of exclusive mode synchronization.
     */
    private transient Thread exclusiveOwnerThread;

AQS专为并发设计的,所以第一反应就是线程安全,觉得这个Thread的定义仅有transient(不序列化),而没有volatile。
比起AQS里清一色的volatile,AOS里的这个Thread的定义没有volatile的原因,我一直没弄明白。

Java的wait或await被唤醒的误区

2014年9月26日 没有评论

先上一个例子,目的是输出一百次condition.await() wake up,代码如下

        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!");

更多内容…

Java线程各种阻塞状态的成因

2014年9月26日 没有评论

Java线程的阻塞状态,共有三种:BLOCKED, WAITING, TIMED_WAITING
对于导致这三种状态的成因,源码里有明确的说明。

        /**
         * 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,

简述:BLOCKED就是等待进入synchronized块或wait被唤醒后返回synchronized块时的等待。
更多内容…