首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReentrantLock不起作用

ReentrantLock不起作用
EN

Stack Overflow用户
提问于 2015-03-25 15:00:43
回答 2查看 1.1K关注 0票数 1

我不明白为什么代码不能正常工作。问题是ReentrantLock没有在ThreadClass.run()中锁定方法调用

资源类-假定哪些方法被锁定在ThreadClass

代码语言:javascript
复制
public class ResourceClass {

    private int i; 

    public void setIncrement() {
        i++;
    }

    public int getIncrement() {
        return i;
    }

}

线程类

代码语言:javascript
复制
public class ThreadClass implements Runnable {

    private ResourceClass resource;
    private ReentrantLock reentrantLock = new ReentrantLock();

    ThreadClass(ResourceClass r) {
        resource = r;
    }

    public void run() {
        reentrantLock.lock();
        try {
            resource.setIncrement();
            System.out.println(resource.getIncrement());
        } finally {
            reentrantLock.unlock();
        }
    }

}

主类

代码语言:javascript
复制
public class MainClass {

    public static void main(String[] args) {

        ResourceClass resource = new ResourceClass();

        Thread thread = new Thread(new ThreadClass(resource));
        thread.start();
        Thread thread2 = new Thread(new ThreadClass(resource));
        thread2.start();
        Thread thread3 = new Thread(new ThreadClass(resource));
        thread3.start();
    }

} 

假定由lock in run()包围的代码必须是“同步的”,因此只有一个线程可以访问Resourse的方法。实际上并非如此,代码会产生重复的数字,这意味着两个线程同时可以访问这些方法。我知道这是一个很简单的问题,但我不知道如何解决。谢谢你的帮助。

更新:

我明白了。这段代码工作得很好(我删除了setIncrement()并将所有相关逻辑放入getIncrement()中):

代码语言:javascript
复制
public int getIncrement() {
        reentrantLock.lock();
        int incrementResult = i++;
        reentrantLock.unlock();
        return incrementResult;
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 15:02:00

您正在每个可运行的地方创建一个新的ReentrantLock,这意味着没有同步。您将需要与每个可运行实例共享一个锁。

票数 5
EN

Stack Overflow用户

发布于 2021-08-09 05:22:10

因此,您的意思是在ReentrantLock类中有一个静态的Thread

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29259240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档