Java同步帮助请求

Java同步帮助请求,java,multithreading,synchronization,Java,Multithreading,Synchronization,我正在为我的应用程序实现一个网络线程管理器。我创建了一个JUnit测试,它通过调用以下两种方法快速请求和发布网络线程索引: protected static final List <Integer> currThreads = new ArrayList <Integer>(); protected static int maxThreads = 5; protected static int

我正在为我的应用程序实现一个网络线程管理器。我创建了一个JUnit测试,它通过调用以下两种方法快速请求和发布网络线程索引:

protected static final List <Integer> currThreads          = new ArrayList <Integer>();
protected static int                  maxThreads           = 5;
protected static int                  lastGrantedId        = 0;

public static synchronized int reqNewThread(){
    if (currThreads.size() >= maxThreads) return -1;
    ++lastGrantedId;
    currThreads.add(lastGrantedId);
    return lastGrantedId;
}

public static void threadFinished(final int threadId) throws InternalError{
    if (threadId == -1) return;
    synchronized (currThreads) {
        boolean works = currThreads.remove(Integer.valueOf(threadId));
        assert works : ("threadId: " + threadId);
    }
}
测试程序线程源:

private class GetAndFree implements Runnable {
    int iters;

    public GetAndFree(int iters){
        this.iters = iters;
    }

    @Override
    public void run(){
        try {
            int id = -1;
            for (int i = 0; i < iters; i++) {
                while ((id = reqNewThread()) == -1) {
                    Thread.sleep(25);
                };
                System.out.println("Strarted: " + id);
                Thread.sleep((long)(Math.random() * 10));
                threadFinished(id);
                System.out.println("Finished: " + id);
            } // for
        } catch(final Exception ex) {
            ex.printStackTrace();
        }
    }
}
私有类GetAndFree实现可运行{
国际热核试验堆;
公共GetAndFree(int iters){
这个。iters=iters;
}
@凌驾
公开募捐{
试一试{
int id=-1;
对于(int i=0;i
唯一使用的全局变量已经同步了,不是吗

没有

第一个方法是在
对象上同步该方法的封闭类

第二种方法是在
currThreads
对象上进行同步

将第一个方法更改为以下方法,它将修复这两个方法的同步问题

public static int reqNewThread(){
    synchronize(currThread) {
        if (currThreads.size() >= maxThreads) return -1;
        ++lastGrantedId;
        currThreads.add(lastGrantedId);
        return lastGrantedId;
    }
}
唯一使用的全局变量已经同步了,不是吗

没有

第一个方法是在
对象上同步该方法的封闭类

第二种方法是在
currThreads
对象上进行同步

将第一个方法更改为以下方法,它将修复这两个方法的同步问题

public static int reqNewThread(){
    synchronize(currThread) {
        if (currThreads.size() >= maxThreads) return -1;
        ++lastGrantedId;
        currThreads.add(lastGrantedId);
        return lastGrantedId;
    }
}
的确谢谢:)我是个白痴。我会尽快接受你的答复。谢谢:)我是个白痴。我会尽快接受你的答复。