首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么要在SemaphoreOnLock实现中使用锁保护构造函数体[JCIP14.12]

为什么要在SemaphoreOnLock实现中使用锁保护构造函数体[JCIP14.12]
EN

Stack Overflow用户
提问于 2017-03-14 04:14:49
回答 1查看 100关注 0票数 0

在《实践中的Java并发》一书中,auhor在ReentrantLock之上提供了以下实现Semaphore

代码语言:javascript
运行
复制
@ThreadSafe
public class SemaphoreOnLock {
    private final Lock lock = new ReentrantLock();
    // CONDITION PREDICATE: permitsAvailable (permits > 0)
    private final Condition permitsAvailable = lock.newCondition();
    @GuardedBy("lock") private int permits;

    SemaphoreOnLock(int initialPermits) {
        lock.lock();
        try {
            permits = initialPermits;
        } finally {
            lock.unlock();
        }
    }

    // BLOCKS-UNTIL: permitsAvailable
    public void acquire() throws InterruptedException {
        lock.lock();
        try {
            while (permits <= 0)
                permitsAvailable.await();
            --permits;
        } finally {
            lock.unlock();
        }
    }

    public void release() {
        lock.lock();
        try {
            ++permits;
            permitsAvailable.signal();
        } finally {
            lock.unlock();
        }
    }
}

你能解释一下为什么我们要在构造函数中使用lock吗?

它与能见度有关吗?

附注:

在同一本书中,你还可以找到this class

代码语言:javascript
运行
复制
@ThreadSafe
public class SafePoint { 
    @GuardedBy("this") private int x, y;
    private SafePoint(int[] a) { this(a[0], a[1]); }
    public SafePoint(SafePoint p) { this(p.get()); }
    public SafePoint(int x, int y) { 
        this.x = x;
        this.y = y;
    }
    public synchronized int[] get() { return new int[] { x, y };
    }
    public synchronized void set(int x, int y) { this.x = x;
        this.y = y;
    }
}

作者说这个类是线程安全的。

EN

回答 1

Stack Overflow用户

发布于 2017-03-14 04:40:06

对int数据类型的更改不是原子的,这就是使用锁保护它的原因

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

https://stackoverflow.com/questions/42772626

复制
相关文章

相似问题

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