【Android】Handler 线程安全

本文讲解既然可以存在多个 Handler 往 MessageQueue 中添加数据(发消息时各个 Handler 可能处于不同线程),那它内部是如何确保线程安全的。

一个线程 对应一个 Looper ,一个 Looper 对应一个 MessageQueue 。所以一个线程只有一个 MessageQueue 。

Q:如何保证线程安全?

A:锁

往 MessageQueue 存消息和取消息的时候都会加锁。

void quit(boolean safe) {
    ...

    synchronized(this) {
        ...
    }
}
Message next() {
        ...        

        for (;;) {
            ...

            synchronized (this) {
                ...
            }

            ...
        }
    }
boolean enqueueMessage(Message msg, long when) {
    ...

    synchronized(this) {
        ...
    }
    
    ...
}

这样就保证了线程安全。

Q:为什么是 synchronized (this) ?

A:synchronized 是一个内置锁。传 this 的原因是它是对整个 MessageQueue 。一个线程只有一个 MessageQueue 。对 MessageQueue 有整个访问过程。也就是说对 MessageQueue 的访问,所有的线程都是去访问同一个消息队列。所以当你在一个线程访问这个锁的时候其他线程都不能去访问。所以这个时候传的是 this 。这个 this 就代表着我们对一个线程的 MessageQueue 去访问的时候,当它访问这个锁,锁住这块代码块的时候,其他的对象只要访问的都是目前这个 this 所对应的 MessageQueue ,那么就都不能访问。

Q:为什么是内置锁?

A:因为这个锁是 JVM 完成的,它的锁的动作和解锁的动作都是由 JVM 完成的。所以叫内置锁。

如果本文对你有帮助,请点赞支持!!!

猜你喜欢

转载自blog.csdn.net/cnwutianhao/article/details/107646675
今日推荐