上学的时候我们经常会去图书馆借书,这个我印象比较深刻(本来想举买火车票的例子)。图书馆里,有一本书叫《JAVA并发编程实战》,小A早上的时候把这本书借走了,小B中午的时候去图书馆找这本书,这里小A和小B分别是两个线程,他们都要看的书是共享资源。
1.通过共享资源通信
小B去了图书馆,发现这本书被借走了(执行了例子中的hasDataToProcess)。他回到家,等了几天,再去图书馆找这本书,发现这本书已经被还回,他顺利借走了书。
2.忙等待
其实小B在小A走后一会就把书还回去了,小A却在几天后才去找的书。为了早点借到书(减少延迟),小A可能就在图书馆等着,每隔几分钟(while循环)他就去检查这本书有没有被还回,这样只要小B一还回书,小A马上就会知道。
3.wait(),notify()和notifyAll()
很多次后,小A发现自己这样做太累了,身体有点吃不消。不过很快,学校图书馆系统改进,加入了短信通知功能(notify()),只要小B一还回书,立马会短信通知小A,这样小A就可以在家睡觉等短信了。
4.丢失的信号
学校图书馆系统是这么设计的:当一本书被还回来的时候,会给等待者发送短信,并且只会发一次,如果没有等待者,他也会发(只不过没有接收者)。问题出现了,因为短信只会发一次,当书被还回来的时候,没有人等待借书,他会发一条空短信,但是之后有等待借此本书的同学永远也不会再收到短信,导致这些同学会无休止的等待。为了避免这个问题,我们在等待的时候先打个电话问问图书馆管理员是否继续等待(if(!wasSignalled))。
5.假唤醒
图书馆系统还有一个BUG:系统会偶尔给你发条错误短信,说书可以借了(其实书不可以借)。我们之前已经给图书馆管理员打过电话了,他说让我们等短信。我们很听话,一等到短信(其实是bug引起的错误短信),就去借书了,到了图书馆后发现这书根本就没还回来!我们很郁闷,但也没办法啊,学校不修复BUG,我们得聪明点:每次在收到短信后,再打电话问问书到底能不能借(while(!wasSignalled))。
并发
最新推荐文章于 2019-07-31 20:12:05 发布