本文讲解既然可以存在多个 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 完成的。所以叫内置锁。
如果本文对你有帮助,请点赞支持!!!