一个精彩的多线程 同步 案例
import java.util.TreeMap; /** * 这个程序演示了利用TreeMap实现小粒度加锁的方法。 * * 多个线程需要并发地从一个TreeMap中查找和修改同一个共享对象。最初,这些共享对象在TreeMap中并不存在; * 每个发现它不存在的线程都将调用loadFromDatabase()方法来创建一个新的对象,并将结果放入TreeMap中。 * 执行这个方法将需要1000ms的时间。 * * 从TreeMap中查找成功后,各个线程都将把自己的名字附加到这个对象的后面,并将该对象打印出来。因此,打 * 印结果就显示了各个线程的修改顺序。 * * 程序利用TreeMap的特性保证了对于每个共享对象,loadFromDatabase()被执行一次且仅一次。同时,它确 * 保不会出现死锁,而且能够避免不同共享对象之间不必要的阻塞。在本程序中,虽然每个共享对象都需要1000ms * 的查找时间,而总的查找时间并不会随着查找的共享对象的数量而发生明显变化。 * * 读者可以试着用Long代替SyncLong,或用其它方法进行实现,以试验在多线程编程环境下由于同步不当而可能 * 出现的性能和稳定性等问题。 */ public class Demo { static long beginFind, lastFind; static TreeMap sharedResourceMap = new TreeMap(); static int i; static class SyncLong implements Comparable { long value; public SyncLong(long value) { this.value = value; } public void block() { //try to lock myself here // System.out.println("lock myself"+System.currentTimeMillis()); synchronized(this){ // System.out.println("unlock myself"+System.currentTimeMillis()); } } public int compareTo(Object obj) { long anotherVal = ((SyncLong)obj).value; if (anotherVal == value) ((SyncLong)obj).block(); return (value
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
【计算机网络】HTTP和HTTPS