利用线程隔离简化并发控制
在Java中,为了限制多个不同线程对共享变量或者状态的访问,利用语言提供的同步或者加锁机制是最简单有效的办法。通过加锁或者同步,我们可以控制同一时间只有一个线程能够访问共享变量或者转台,从而保证变量或者状态的在多个线程之间的一致性和完整性。加锁或者同步的方式对于所有需要限制线程对其进行访问的变量或者状态来说都是有效的,但是对于有些场景来说并不是最好的。也就是说,在某些场景下,通过加锁或者同步确实可以保证程序在多线程环境下的正确性,但是也对程序的性能造成了很大的伤害。
下面的代码给出了一个例子。我们定义了一个Cooker类,这个类有一个cook方法,在cook方法中会根据其menu属性执行一些操作。menu中可能包含的信息包括要做什么菜、配料是什么、要不要放辣椒等等。
public class Cooker { private Menu menu = null; public void setMenu(Menu menu) { this.menu = menu; } public void cook() { Menu menu = menu; //cook according to the menu }}class Kitchen { private Cooker cooker = new Cooker(); public void doCook() { Menu menu = new Menu(); synchronized (cooker) { cooker.setMenu(menu); cooker.cook(); } }}public class Cooker { Map<Thread, Menu> menuPerThreadMap = new ConcurrentHashMap<Thread, Menu>(); public void setMenu(Menu menu) { Thread currentThread = getCurrentThread(); menuPerThreadMap.put(currentThread, menu); } public void cook() { Thread currentThread = getCurrentThread(); Menu menu = menuPerThreadMap.get(currentThread); if (menu != null) { //cook according to the menu } } private Thread getCurrentThread() { return Thread.currentThread(); }}