有太多时候,我们一旦写出能工作的代码,就转移到下一个问题上,而没有下足功夫调整代码,让后来者易于阅读。记住,下一位读代码的人最有可能是你自己。
所以,多少尊重一下你的手艺吧。花一点点实践在每个函数和类上。选用较好的名称,将大函数切分为小函数,时时照拂自己创建的东西。用心是最珍贵的资源。
线程安全群集:
对于Java,需要掌握java.until.concurrent 、java.util.concurrent.atomic和java.util.concurrent.locks
互斥:
每一时刻仅有一个线程能访问共享资源。
线程饥饿:
一个或一组线程在很长时间内或永久被禁止。例如,总是让执行得快的线程先运行,假如执行快得线程没完没了,则执行时间长的线程就会"挨饿"。
死锁:
两个或多个线程相互等待执行结束。每个线程都拥有其它线程需要的资源,如果得不到其它线程拥有的资源,就无法终止。
并发问题的三种模型
- 生产者-消费者模型
- 读者-作者模型
- 哲学家就餐
你可能遇到的并发问题,大多数都是以上3重模型的变种。
临界区
指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用,例如:semaphore。只能被单一线程访问的设备,例如:打印机。
临界区是为了确保程序正确而要阻止同时使用的代码区域。
要编写整洁代码,必须先写肮脏代码,然后再清理它。
你应该不会对此感到惊讶。我们在小学就学过这条真理了。那时,老师(通常是徒劳地)努力让我们写作文草稿。他们告诉我们,我们应该先写草稿,再写二稿,一次又一次地草撰,直至写出终稿。他们尽力告诉我们,写出好作文是一个逐步改进的过程。
多数新手程序员(就像多数小学生一样)没有特别认真地遵循这个建议。他们相信,首要任务是能写出工作的程序。只要程序"能工作",就转移到下一个任务上,而那个"能工作"的程序就留在了最后那个所谓"能工作"的状态。多数有经验的程序员都知道,这是一种自毁行为。