Java筛选器锁实现挂起

Java筛选器锁实现挂起,java,multithreading,Java,Multithreading,我实现了Java过滤器锁,如下所示: public class Filter implements Lock { int[] level; int[] victim; int n; public Filter(int n) { this.n = n; level = new int[n]; victim = new int[n]; } @Override public void lock() { int me = ConcurrencyUtils.getCur

我实现了Java过滤器锁,如下所示:

public class Filter implements Lock {
int[] level;
int[] victim;
int n;

public Filter(int n) {
    this.n = n;
    level = new int[n];
    victim = new int[n];
}

@Override
public void lock() {
    int me = ConcurrencyUtils.getCurrentThreadId();
    for (int i = 1; i < n; i++) {
        level[me] = i;
        victim[i] = me;

        boolean conflicts = true;
        while (conflicts) {
            conflicts = false;
            for (int k = 0; k < n; k++) {
                if (k != me && level[k] >= i && victim[i] == me) {
                    conflicts = true;
                    break;
                }
            }
        }
    }
}

@Override
public void unlock() {
    int me = ConcurrencyUtils.getCurrentThreadId();
    level[me] = 0;
}
...
}
这来自AlgorithmRunner类的性能比较部分:

    Thread[] threads = new Thread[threadCount];
    long threadNumber = 0;

    long startTime = System.nanoTime();

    for (int i = 0; i < threads.length; i++) {
        threads[i] = new Thread(counter);
        threads[i].setName(String.valueOf(threadNumber++));
    }        

    for (Thread thread : threads) {
        thread.start();
    }

    for (Thread thread : threads) {
        thread.join();
    }

    long finishTime = System.nanoTime();

    return TimeUnit.NANOSECONDS.toMillis(finishTime - startTime);
Thread[]threads=新线程[threadCount];
长螺纹数=0;
long startTime=System.nanoTime();
对于(int i=0;i
每当我在线程数大于3的情况下运行它时,它就会挂起。我的意思是它会循环很长一段时间(可能是无限的),实际上它不会挂起。它在锁循环中运行。似乎lock方法有问题(当我将线程睡眠设置为lock时,我可以看到它最多可以运行5个线程)

但是,少于3分钟就可以了。我比较了我的自定义锁和Java的ReentrantLock的性能。它在很短的时间内完成所有事情,即使像往常一样有更多的线程

我在实现时错过了什么

ps1:我已经遵循了《多处理的艺术》这本书作为我的例子

PS 2:这里是挂起时的线程转储:

Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.60-b09 mixed mode):

"2" prio=10 tid=0x00007f4c6837f000 nid=0x76ff runnable [0x00007f4c4dc8a000]
   java.lang.Thread.State: RUNNABLE
    at org.oocp.filter.Filter.lock(Filter.java:33)
    at org.oocp.Counter.getAndIncrement(Counter.java:50)
    at org.oocp.Counter.run(Counter.java:65)
    at java.lang.Thread.run(Thread.java:745)

"1" prio=10 tid=0x00007f4c68379000 nid=0x76fe runnable [0x00007f4c4db89000]
   java.lang.Thread.State: RUNNABLE
    at org.oocp.filter.Filter.lock(Filter.java:33)
    at org.oocp.Counter.getAndIncrement(Counter.java:50)
    at org.oocp.Counter.run(Counter.java:65)
    at java.lang.Thread.run(Thread.java:745)

"0" prio=10 tid=0x00007f4c68378800 nid=0x76fd runnable [0x00007f4c4dd8b000]
   java.lang.Thread.State: RUNNABLE
    at org.oocp.filter.Filter.lock(Filter.java:33)
    at org.oocp.Counter.getAndIncrement(Counter.java:50)
    at org.oocp.Counter.run(Counter.java:65)
    at java.lang.Thread.run(Thread.java:745)

"Service Thread" daemon prio=10 tid=0x00007f4c681e6800 nid=0x7608 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007f4c681e4000 nid=0x7607 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007f4c681e1000 nid=0x7606 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007f4c681df800 nid=0x7605 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007f4c681bf800 nid=0x7604 in Object.wait() [0x00007f4c4efee000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007db310398> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    - locked <0x00000007db310398> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" daemon prio=10 tid=0x00007f4c681bd800 nid=0x7603 in Object.wait() [0x00007f4c4f0ef000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007db310440> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:503)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
    - locked <0x00000007db310440> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x00007f4c68009800 nid=0x75f9 in Object.wait() [0x00007f4c701c4000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007d7014ad0> (a java.lang.Thread)
    at java.lang.Thread.join(Thread.java:1281)
    - locked <0x00000007d7014ad0> (a java.lang.Thread)
    at java.lang.Thread.join(Thread.java:1355)
    at org.oocp.AlgorithmRunner.runTest(AlgorithmRunner.java:45)
    at org.oocp.AlgorithmRunner.runStatistics(AlgorithmRunner.java:63)
    at org.oocp.AlgorithmRunner.main(AlgorithmRunner.java:24)

"VM Thread" prio=10 tid=0x00007f4c681b9000 nid=0x7602 runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f4c6801f800 nid=0x75fa runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f4c68021800 nid=0x75fb runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f4c68023000 nid=0x75fc runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f4c68025000 nid=0x75fd runnable 

"GC task thread#4 (ParallelGC)" prio=10 tid=0x00007f4c68027000 nid=0x75fe runnable 

"GC task thread#5 (ParallelGC)" prio=10 tid=0x00007f4c68029000 nid=0x75ff runnable 

"GC task thread#6 (ParallelGC)" prio=10 tid=0x00007f4c6802a800 nid=0x7600 runnable 

"GC task thread#7 (ParallelGC)" prio=10 tid=0x00007f4c6802c800 nid=0x7601 runnable 

"VM Periodic Task Thread" prio=10 tid=0x00007f4c681f1000 nid=0x7609 waiting on condition 

JNI global references: 236

Heap
 PSYoungGen      total 68608K, used 22516K [0x00000007d7000000, 0x00000007db800000, 0x0000000800000000)
  eden space 63488K, 33% used [0x00000007d7000000,0x00000007d84f5308,0x00000007dae00000)
  from space 5120K, 20% used [0x00000007db300000,0x00000007db408010,0x00000007db800000)
  to   space 5120K, 0% used [0x00000007dae00000,0x00000007dae00000,0x00000007db300000)
 ParOldGen       total 83968K, used 16K [0x0000000785000000, 0x000000078a200000, 0x00000007d7000000)
  object space 83968K, 0% used [0x0000000785000000,0x0000000785004000,0x000000078a200000)
 PSPermGen       total 21504K, used 6588K [0x000000077fe00000, 0x0000000781300000, 0x0000000785000000)
  object space 21504K, 30% used [0x000000077fe00000,0x000000078046f0c0,0x0000000781300000)
全线程转储Java热点(TM)64位服务器VM(24.60-b09混合模式):
“2”优先级=10 tid=0x00007f4c6837f000 nid=0x76ff可运行[0x00007f4c4dc8a000]
java.lang.Thread.State:可运行
位于org.oocp.filter.filter.lock(filter.java:33)
位于org.oocp.Counter.getAndIncrement(Counter.java:50)
运行(Counter.java:65)
运行(Thread.java:745)
“1”优先级=10 tid=0x00007f4c68379000 nid=0x76fe可运行[0x00007f4c4db89000]
java.lang.Thread.State:可运行
位于org.oocp.filter.filter.lock(filter.java:33)
位于org.oocp.Counter.getAndIncrement(Counter.java:50)
运行(Counter.java:65)
运行(Thread.java:745)
“0”优先级=10 tid=0x00007F4C6878800 nid=0x76fd可运行[0x00007f4c4dd8b000]
java.lang.Thread.State:可运行
位于org.oocp.filter.filter.lock(filter.java:33)
位于org.oocp.Counter.getAndIncrement(Counter.java:50)
运行(Counter.java:65)
运行(Thread.java:745)
“服务线程”守护进程prio=10 tid=0x00007f4c681e6800 nid=0x7608 runnable[0x0000000000000000]
java.lang.Thread.State:可运行
“C2编译器线程1”守护程序prio=10 tid=0x00007f4c681e4000 nid=0x7607等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
“C2编译器线程0”守护程序prio=10 tid=0x00007f4c681e1000 nid=0x7606等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
“信号调度器”守护程序prio=10 tid=0x00007f4c681df800 nid=0x7605等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
对象中的“终结器”守护程序prio=10 tid=0x00007f4c681bf800 nid=0x7604。wait()[0x00007f4c4efee000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.ReferenceQueue$Lock)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
-锁定(java.lang.ref.ReferenceQueue$Lock)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
位于java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
对象中的“引用处理程序”守护程序prio=10 tid=0x00007f4c681bd800 nid=0x7603.wait()[0x00007f4c4f0ef000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.Reference$Lock)
等待(Object.java:503)
在java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
-锁定(一个java.lang.ref.Reference$Lock)
Object.wait()中的“main”prio=10 tid=0x00007f4c68009800 nid=0x75f9[0x00007f4c701c4000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(一个java.lang.Thread)
位于java.lang.Thread.join(Thread.java:1281)
-锁定(一个java.lang.Thread)
位于java.lang.Thread.join(Thread.java:1355)
位于org.oocp.AlgorithmRunner.runTest(AlgorithmRunner.java:45)
位于org.oocp.AlgorithmRunner.runStatistics(AlgorithmRunner.java:63)
位于org.oocp.AlgorithmRunner.main(AlgorithmRunner.java:24)
“VM线程”优先级=10 tid=0x00007f4c681b9000 nid=0x7602可运行
“GC任务线程#0(并行GC)”优先级=10 tid=0x00007f4c6801f800 nid=0x75fa可运行
“GC任务线程#1(并行GC)”优先级=10 tid=0x00007F4C6821800 nid=0x75fb可运行
“GC任务线程#2(并行GC)”优先级=10 tid=0x00007F4C6802300NID=0x75fc可运行
“GC任务线程#3(并行GC)”优先级=10 tid=0x00007F4C6825000 nid=0x75fd可运行
“GC任务线程4(并行GC)”优先级=10 tid=0x00007F4C6802700NID=0x75fe可运行
“GC任务线程#5(并行GC)”优先级=10 tid=0x00007f4c68029000 nid=0x75ff可运行
“GC任务线程#6(并行GC)”优先级=10 tid=0x00007f4c6802a800 nid=0x7600可运行
“GC任务线程#7(并行GC)”优先级=10 tid=0x00007F4C802C800 nid=0x7601可运行
“VM定期任务线程”优先级=10 tid=0x00007f4c681f1000 nid=0x7609等待状态
JNI全球参考:236
堆
PSYoungGen总计68608K,使用22516K[0x00000007d7000000,0x00000007db800000,0x000000080000000)
eden空间63488K,使用率33%[0x00000007d7000000,0x00000007d84f5308,0x00000007dae00000)
从空间5120K开始,20%已使用[0x00000007db300000,0x00000007DB408100,0x00000007db800000)
对于空间5120K,0%已使用[0x00000007DAE000000,0x00000007DAE000000,0x00000007db300000)
ParOldGen总计83968K,使用16K[0x0000000785000000,0x000000078a200000,0x00000007d7000000)
对象空间83968K,已使用0%[0x0000000785000000,0x00000007850040000,0x000000078a200000)
PSPermGen总计21504K,使用6588K[0x000000077fe00000,0x0000000781300000,0x0000000785000000)
对象空间21504K,3
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.60-b09 mixed mode):

"2" prio=10 tid=0x00007f4c6837f000 nid=0x76ff runnable [0x00007f4c4dc8a000]
   java.lang.Thread.State: RUNNABLE
    at org.oocp.filter.Filter.lock(Filter.java:33)
    at org.oocp.Counter.getAndIncrement(Counter.java:50)
    at org.oocp.Counter.run(Counter.java:65)
    at java.lang.Thread.run(Thread.java:745)

"1" prio=10 tid=0x00007f4c68379000 nid=0x76fe runnable [0x00007f4c4db89000]
   java.lang.Thread.State: RUNNABLE
    at org.oocp.filter.Filter.lock(Filter.java:33)
    at org.oocp.Counter.getAndIncrement(Counter.java:50)
    at org.oocp.Counter.run(Counter.java:65)
    at java.lang.Thread.run(Thread.java:745)

"0" prio=10 tid=0x00007f4c68378800 nid=0x76fd runnable [0x00007f4c4dd8b000]
   java.lang.Thread.State: RUNNABLE
    at org.oocp.filter.Filter.lock(Filter.java:33)
    at org.oocp.Counter.getAndIncrement(Counter.java:50)
    at org.oocp.Counter.run(Counter.java:65)
    at java.lang.Thread.run(Thread.java:745)

"Service Thread" daemon prio=10 tid=0x00007f4c681e6800 nid=0x7608 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x00007f4c681e4000 nid=0x7607 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x00007f4c681e1000 nid=0x7606 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00007f4c681df800 nid=0x7605 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00007f4c681bf800 nid=0x7604 in Object.wait() [0x00007f4c4efee000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007db310398> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
    - locked <0x00000007db310398> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" daemon prio=10 tid=0x00007f4c681bd800 nid=0x7603 in Object.wait() [0x00007f4c4f0ef000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007db310440> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:503)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
    - locked <0x00000007db310440> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x00007f4c68009800 nid=0x75f9 in Object.wait() [0x00007f4c701c4000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007d7014ad0> (a java.lang.Thread)
    at java.lang.Thread.join(Thread.java:1281)
    - locked <0x00000007d7014ad0> (a java.lang.Thread)
    at java.lang.Thread.join(Thread.java:1355)
    at org.oocp.AlgorithmRunner.runTest(AlgorithmRunner.java:45)
    at org.oocp.AlgorithmRunner.runStatistics(AlgorithmRunner.java:63)
    at org.oocp.AlgorithmRunner.main(AlgorithmRunner.java:24)

"VM Thread" prio=10 tid=0x00007f4c681b9000 nid=0x7602 runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f4c6801f800 nid=0x75fa runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f4c68021800 nid=0x75fb runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f4c68023000 nid=0x75fc runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f4c68025000 nid=0x75fd runnable 

"GC task thread#4 (ParallelGC)" prio=10 tid=0x00007f4c68027000 nid=0x75fe runnable 

"GC task thread#5 (ParallelGC)" prio=10 tid=0x00007f4c68029000 nid=0x75ff runnable 

"GC task thread#6 (ParallelGC)" prio=10 tid=0x00007f4c6802a800 nid=0x7600 runnable 

"GC task thread#7 (ParallelGC)" prio=10 tid=0x00007f4c6802c800 nid=0x7601 runnable 

"VM Periodic Task Thread" prio=10 tid=0x00007f4c681f1000 nid=0x7609 waiting on condition 

JNI global references: 236

Heap
 PSYoungGen      total 68608K, used 22516K [0x00000007d7000000, 0x00000007db800000, 0x0000000800000000)
  eden space 63488K, 33% used [0x00000007d7000000,0x00000007d84f5308,0x00000007dae00000)
  from space 5120K, 20% used [0x00000007db300000,0x00000007db408010,0x00000007db800000)
  to   space 5120K, 0% used [0x00000007dae00000,0x00000007dae00000,0x00000007db300000)
 ParOldGen       total 83968K, used 16K [0x0000000785000000, 0x000000078a200000, 0x00000007d7000000)
  object space 83968K, 0% used [0x0000000785000000,0x0000000785004000,0x000000078a200000)
 PSPermGen       total 21504K, used 6588K [0x000000077fe00000, 0x0000000781300000, 0x0000000785000000)
  object space 21504K, 30% used [0x000000077fe00000,0x000000078046f0c0,0x0000000781300000)
AtomicInteger[] level;
AtomicInteger[] victim;