×

Loading...
Ad by
Ad by

开始学习JAVA,搞了一晚JIVE论坛终于搭建好了。但是看代码看到HASH CACHE那一段有一句看不懂,哪位熟悉JIVE的讨论讨论?

关于Jive论坛中CACHE机制的一个疑问
ThreadMode1.jsp:
ForumThread thread = forum.getThread(threadID);
...
DBForumFactory.java:
DbForumThread thread = cacheManager.threadCache.get(threadID);

ForumThreadCache.java:
DbForumThread thread = (DbForumThread)cache.get(threadID);

LongCache.Java:
LongCacheObject cacheObject = (LongCacheObject)cachedObjectsHash.get(key);


public final Object get(long key) {
int i = indexOfKey(key); //问题在这里,按照HASH算法,有可能是多个thread id(key)对应一个hash值i的
//If not in the map return null
if (i<0) {
return null;
}
else {
return values[i];//而这里直接返回了一个i的object,怎么能保证这个object就是唯一的呢?不会是每次遇到重复的hash值就把上次的覆盖掉吧??如果覆盖了怎么保证读取的ThreadID是唯一的,请高手指点指点
}
}
Report

Replies, comments and Discussions:

  • 工作学习 / IT技术讨论 / 开始学习JAVA,搞了一晚JIVE论坛终于搭建好了。但是看代码看到HASH CACHE那一段有一句看不懂,哪位熟悉JIVE的讨论讨论?
    关于Jive论坛中CACHE机制的一个疑问
    ThreadMode1.jsp:
    ForumThread thread = forum.getThread(threadID);
    ...
    DBForumFactory.java:
    DbForumThread thread = cacheManager.threadCache.get(threadID);

    ForumThreadCache.java:
    DbForumThread thread = (DbForumThread)cache.get(threadID);

    LongCache.Java:
    LongCacheObject cacheObject = (LongCacheObject)cachedObjectsHash.get(key);


    public final Object get(long key) {
    int i = indexOfKey(key); //问题在这里,按照HASH算法,有可能是多个thread id(key)对应一个hash值i的
    //If not in the map return null
    if (i<0) {
    return null;
    }
    else {
    return values[i];//而这里直接返回了一个i的object,怎么能保证这个object就是唯一的呢?不会是每次遇到重复的hash值就把上次的覆盖掉吧??如果覆盖了怎么保证读取的ThreadID是唯一的,请高手指点指点
    }
    }
    • How about your job? Like it?
      • 我迟点才开始工作,正在在看JAVA和数据挖掘的东西充充电。对了,我想问问这里有没有比较熟悉UNIX/LINUX 内核/C的高手,有一些关于锁和队列的问题想请教
        怎样可以在UNIX/LINUX下实现一个队列,两条线程一个IN 一个OUT,完全不加锁
        • 我用进程做过,申请一块了share memory. 线程应该更容易吧。
          申请一块memory ,假设100K, 每个对象1K,最多100个对象。
          int nHeader =0;
          int nTail=0;

          push thread:
          if ( (nTail < (nHeader +100 ) )
          {
          Q[ nTail%100 ] = new object;
          nTail++;
          }
          else
          wait;

          Pop Thread:
          if ( nHeader < nTail )
          {
          object = Q[nHeader %100];
          nHeader++;
          }
          else
          wait;
          • 高手!构思果然巧妙,精华在于%号和+100,又学到东西了:) 还想请教如果不用定长的数组,用链表+指针能否做到?
            • 指针好像比较容易出问题。不加锁的话会有问题。
              • 我以前的一个同事说他能用指针实现这个,我又不是很好意思直接问他。等我再找找资料吧。
          • 所有的内核代码在任意时都可抢占的话就应该遵循强制性的锁。
            • 这只是一个关于队列的常规做法,这里真正写过内核的恐怕没几个吧。
              • 写过
                作业。
              • 我就是不明白你为什么这样写啊.过去学操作系统,呵呵,这个系统是一再强调什么多处理机什么的
                • 初级程序员不懂加解锁为何物,中级程序员知道加锁但是经常忘记解锁,高级程序员懂得怎样加解锁,大师者能不用锁尽量不用:)
                • 在确定只有两个进/线程访问时,这样的队列是可行并且高效的。不需要从新申请/释放内存,重复使用。
                  • 你有没有测试过两个进程/线程这样访问一个队列比多个线程访问队列快多少?
            • 内核代码里面的锁乱七八糟故领精怪,其实到最后都是靠硬件总线来实现吧