Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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 - Fatal编程技术网

Java 多线程:显式锁

Java 多线程:显式锁,java,Java,我对这几行代码有一个问题: class S1Es3SharedState { //lock private final Lock lock = new ReentrantLock(); private int x = 0; public int getX() { lock.lock(); try { return x; } finally { lock.unlock

我对这几行代码有一个问题:

class S1Es3SharedState {
    //lock
    private final Lock lock = new ReentrantLock();
    private int x = 0;

    public int getX() {
        lock.lock();
        try {
            return x;
        } finally  {
            lock.unlock();
        }
    }

    public void incrementX() {
        lock.lock();
        try {
            this.x = x++;
        } finally {
            lock.unlock();
        }
    }
}

同一个对象在方法getX和方法incrementX
中锁定stations是什么意思?
如果我理解这意味着使用同一个对象来锁定两个方法的station,那么,如果两个方法都是空闲的,线程可以进入其中一个方法,是吗?

示例:
ThreadA在getX方法中,现在有一个上下文开关,因此ThreadA正在等待(在方法中),ThreadB正在运行,希望进入getX()方法,但它不能,因为已经有ThreadA了。另外,如果ThreadB需要输入递增x方法,它仍然不能输入,因为ThreadA在getX方法中。因此,我使用的lock对象允许在两个方法都是空闲的情况下输入线程(没有正在运行的线程)。有可能吗?这是因为我使用了同一个对象来锁定getX和incrementX方法。

这意味着两个不同的线程T1和T2不能获取
并在同一时刻递增变量

简单地说,
返回x
this.x=x++无法执行
同时通过两个不同的线程T1和T2。线程
只有在完成并调用unlock时,才进入第一个赢家,
第二个人将有机会自己获得锁

做他的工作

只是一个与你的问题无关的旁白。。。你是否意识到,
this.x=x++
x++
更为冗长和怪异?是的,但我用eclipse(以自动方式)做得非常快,只是为了举个例子,在每种情况下我都知道:)谢谢,在某种程度上就像交通灯一样,当在这两种方法中的一种中输入T1或T2时。。。这交通灯是红色的,当这两种方法都免费时,它将是绿色的,对吗?此交通灯控制2条街道(方法),当两条街道都空闲时,灯为绿色。我能这样想象吗?是的,我觉得这是个很好的类比。锁定对象只是一个,锁定对象是红绿灯。方法是两条街道。