Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中锁的最简单实现_Java_Concurrency_Locking - Fatal编程技术网

java中锁的最简单实现

java中锁的最简单实现,java,concurrency,locking,Java,Concurrency,Locking,可能重复: 我试图在petersen方法的行中实现Java中的锁(锁接口)。为了保证互斥性,最简单的非重入实现是什么 flag[0] = 0; flag[1] = 0; turn; P0: flag[0] = 1; P1: flag[1] = 1; turn = 1; turn = 0; while (flag[1] == 1 &&

可能重复:

我试图在petersen方法的行中实现Java中的锁(锁接口)。为了保证互斥性,最简单的非重入实现是什么

flag[0]   = 0;
flag[1]   = 0;
turn;

P0: flag[0] = 1;                            P1: flag[1] = 1;
    turn = 1;                                   turn = 0;
    while (flag[1] == 1 && turn == 1)           while (flag[0] == 1 && turn == 0)
    {                                           {
           // busy wait                                  // busy wait
    }                                           }                                 
    // critical section                         // critical section 
       ...                                        ...
    // end of critical section                  // end of critical section
    flag[0] = 0;                                flag[1] = 0;
我正在使用上述算法(来自wiki)。尽管使用了volatile flag和turn变量,但它似乎不起作用,因为我得到了很多数据竞争。有什么事情要处理

代码如下:

public class TestLock implements Lock {

    private final long thread1ID;
    private final long thread2ID;
    private volatile AtomicIntegerArray flagArr = new AtomicIntegerArray(50);
    private volatile long turn = 0;
    private volatile long currentThreadID = 0;

    public TestLock(Thread thread1, Thread thread2) {       
        thread1ID = t0.getId();
        thread2ID = t1.getId();         
        flagArr.set((int)thread1ID, 0);
        flagArr.set((int)thread2ID, 0);     
    }
    public void lock() {        
        currentThreadID = Thread.currentThread().getId();
        flagArr.set((int)Thread.currentThread().getId(), 1);            
        turn = next();          
        while(turn == next() && flagArr.get((int)next()) == 1)
        {
            System.out.println(Thread.currentThread().getId()+" waiting");              
        }
        //critical section
        System.out.println(Thread.currentThread().getId()+" executing");
        }

    private long next() {
        return Thread.currentThread().getId() == thread1ID ? thread2ID : thread1ID;     
    }

    public void unlock() {      
        flagArr.set((int)Thread.currentThread().getId(), 0);    
    }
}

好的,根据已接受答案中的注释,一个问题是您不能使用
boolean[]
并期望单元格具有
volatile
语义


如果您发布了您的代码,我们可能会提供更多建议。

好吧,根据已接受的答案中的注释,一个问题是您不能使用
布尔[]
并期望单元格具有
volatile
语义


如果您发布了代码,我们可能会提供更多建议。

此问题的可能答案:嗯,此代码似乎实现了相关问题答案中提到的所有内容。此问题的可能答案:嗯,这段代码似乎实现了相关问题答案中提到的所有内容。我已经更新了代码。你能看一下吗?我已经更新了密码。你能看一下吗。