public class StrippingLock implements Runnable{ private final Object[] locks; private static final int N_LOCKS = 4; private final String [] share ; private int opNum; private int N_ANUM; public Stripp
public class StrippingLock implements Runnable{
private final Object[] locks;
private static final int N_LOCKS = 4;
private final String [] share ;
private int opNum;
private int N_ANUM;
public StrippingLock(int on, int anum) {
opNum = on;
N_ANUM = anum;
share = new String[N_ANUM];
locks = new Object[N_LOCKS];
for (int i = 0; i<N_LOCKS; i++)
locks[i] = new Object();
}
public synchronized void put1(int indx, String k) {
share[indx] = k; //acquire the object lock
}
public void put2(int indx, String k) {
synchronized (locks[indx%N_LOCKS]) {
share[indx] = k; // acquire the corresponding lock
}
}
public void run()
{
//The expensive put
/*for (int i=0; i<opNum; i++)
{
put1(i%N_ANUM, Integer.toString(i+1));
}*/
//The cheap put
for (int i=0; i<opNum; i++)
{
put2(i%N_ANUM, Integer.toString(i+1));
}
}
}
results from JLM report
使用 put1 的结果
MON-NAME [08121228] StrippingLock@D79962D8 (Object)
%MISS GETS NONREC SLOW REC TIER2 TIER3 %UTIL AVER_HTM
0 4830690 4830690 460 0 229538313 5010789 18 2552
Execution Time: 5536 milliseconds
使用 put2 的结果
MON-NAME [08121388] java/lang/Object@D79964B8 (Object)
%MISS GETS NONREC SLOW REC TIER2 TIER3 %UTIL AVER_HTM
0 4591046 4591046 1517 0 151042525 3016162 13 1925
MON-NAME [08121330] java/lang/Object@D79964C8 (Object)
%MISS GETS NONREC SLOW REC TIER2 TIER3 %UTIL AVER_HTM
0 1717579 1717579 523 0 50596994 958796 5 1901
MON-NAME [081213E0] java/lang/Object@D79964D8 (Object)
%MISS GETS NONREC SLOW REC TIER2 TIER3 %UTIL AVER_HTM
0 1814296 1814296 536 0 58043786 1113454 5 1799
MON-NAME [08121438] java/lang/Object@D79964E8 (Object)
%MISS GETS NONREC SLOW REC TIER2 TIER3 %UTIL AVER_HTM
0 3126427 3126427 901 0 96627408 1857005 9 1979
Execution Time: 1857 milliseconds
织梦好,好织梦 |
内容来自dedecms
在某些应用中,我们会使用一个共享变量缓存常用的计算结果。每次更新操作都需要修改该共享变量以保证其有效性。例如,队列的 size,counter,链表的头节点引用等。在多线程应用中,该共享变量需要用锁保护起来。这种在单线程应用中常用的优化方法会成为多线程应用中的“热点域 (hot field) ”,从而限制可伸缩性。如果一个队列被设计成为在多线程访问时保持高吞吐量,那么可以考虑在每个入队和出队操作时不更新队列 size 。 ConcurrentHashMap 中为了避免这个问题,在每个分片的数组中维护一个独立的计数器,使用分离的锁保护,而不是维护一个全局计数。
织梦内容管理系统
copyright dedecms
复制地址和好友共享









