同步、异步和阻塞、非阻塞

1. 同步与异步

同步和异步主要关注的是消息通知机制。

同步调用发出后,调用者需要一直等待返回消息通知后,才能继续执行。 —  主动获取消息(消息通知)

异步调用发出后,调用者不能立即获得返回消息,立即返回完成调用,直到被调用者在完成后,通过状态、通知或回调来通知调用者。 — 被通知获取消息(消息通知)

2. 阻塞与非阻塞

阻塞和非阻塞主要关注的是线程等待消息通知时的状态。

阻塞调用发出后,调用者(当前线程)会被挂起,需要一直进行等待消息通知,中间不能执行其他业务,等待消息收到后才进行返回。 — 线程挂起(状态)

非阻塞调用发出后,调用者(当前线程)不会被阻塞挂起,而是立即返回。 — 线程不被挂起(状态)

阅读全文 –

杭州

有座城市叫:杭州
一个稍微不努力就可能卷铺盖走人的城市
一个只要你肯努力就可以改变命运的地方
这里不相信眼泪,只相信汗水,付出才会有回报,别让这座城市留下了你的青春,却留不住你
没有梦想,何必杭州

Java中可重入锁ReentrantLock

ReentrantLock是JDK1.5中java util concurrent (JUC)包提供的一种锁实现,和synchronized不同,synchronized是由JVM操控获取锁和释放锁,ReentrantLock是从代码层面实现的同步。
ReentrantLock类的结构图:
阅读全文 –

Java中的读/写锁

相比饥饿与公平里Lock的实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。

Java5在java.util.concurrent包中已经包含了读写锁。尽管如此,我们还是应该了解其实现背后的原理。

阅读全文 –

饥饿与公平

如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为“饥饿”。线程被“饥饿致死”正是因为它得不到CPU运行时间的机会,解决饥饿的方案被称之为“公平性” – 即所有线程均能公平地获得运行机会。

阅读全文 –