`
whitesock
  • 浏览: 483112 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Sequantial Lock in Java

阅读更多

1 Overview
   Linux内核中常见的同步机制有Atomic Operation,Spin Locks,Semaphore,Mutex等。其中Spin Locks和Semaphore都支持读/写锁。此外,Linux内核还支持一种更轻量级的读/写锁定机制:Sequential Lock。跟其它读/写锁定机制相比,Sequential Lock有以下特点:

  • 在获取锁时偏向写锁。只要他人不持有写锁,那么获得写锁的操作总是能够成功。
  • 读操作时不需要获得锁(即读操作永远不会被阻塞),然而在有些情况下读操作需要重试。
  • Sequential Lock更轻量级,可伸缩性相对更好。

2 Linux Kernel's Implementation
   以下是2.6版本的内核中,Sequential Lock的实现:

typedef struct {
  unsigned sequence;
  spinlock_t lock;
} seqlock_t;

static inline void write_seqlock(seqlock_t *sl)
{
  spin_lock(&sl->lock);
  ++sl->sequence;
  smp_wmb();
}

static inline void write_sequnlock(seqlock_t *sl)
{
  smp_wmb();
  sl->sequence++;
  spin_unlock(&sl->lock);
}

static __always_inline unsigned read_seqbegin(const seqlock_t *sl)
{
  unsigned ret = sl->sequence;
  smp_rmb();
  return ret;
}

static __always_inline int read_seqretry(const seqlock_t *sl, unsigned iv)
{
  smp_rmb();
  return (iv & 1) | (sl->sequence ^ iv);
}

   以上代码中,通过使用spin lock保证了write操作的原子性。需要注意的是,Linux spin lock是非可重入锁,这也是read_seqretry方法中可以通过(iv & 1)判断一个写操作是否正在进行中的原因。此外,Linux spin lock只能保证原子性,为了避免由于编译器或者处理器对指令的重排序(例如x86平台不会对写操作重排序,但是可能会对读操作进行重排序)所导致的潜在问题,seqlock使用memory barrier(smp_wmb和smp_rmb)保证了内存可见性。

   seqlock的用法如下:
   To define a seqlock:

seqlock_t mr_seq_lock = DEFINE_SEQLOCK(mr_seq_lock);

   The write path:

write_seqlock(&mr_seq_lock);
/* write lock is obtained... */
write_sequnlock(&mr_seq_lock);

   The read path:

unsigned long seq;
do {
  seq = read_seqbegin(&mr_seq_lock);
  /* read data here ... */
} while (read_seqretry(&mr_seq_lock, seq));

 

  seqlock的典型使用场景如下:

  • 跟读操作的数量相比,写操作的数量很少。
  • 在锁获取时,希望写操作优先。

  使用seqlock的注意事项:

  • 读操作耗时应比较短,否则容易导致过多次的读重试。
  • 由于在读的过程中写操作可能正在修改数据,因此读操作可能会读取到某种不一致的状态。所以进行读取时,需要保护性的验证,以避免因读取不一致的错误数据导致错读。

3 Sequential Lock in Java
   本想自己实现一个Java版本的Sequential lock,但是在Google了之后发现Makoto YUI已经提供了一比较好的实现,在其基础之上稍加改动之后的实现如下:

public final class SequentialLock {
    //
    private volatile int counter;

    /**
     * 
     */
    public int readBegin() {
        return this.counter;
    }

    public boolean readRetry(int v) {
        return (v & 1) == 1 || this.counter != v;
    }
    
    public synchronized void writeLock() {
        //
        if((this.counter & 1) != 0) {
            throw new IllegalStateException("sequential lock is NOT reentrantable");
        }
        
        //
        ++this.counter;
    }
    
    public synchronized void writeUnlock() {
        ++this.counter;
    }
} 

   首先,SequentialLock不是可重入的。其次由于读操作没有获得锁,因此读写之间需要额外的机制以保证内存可见性:对其volitle counter成员变量的读写保证了Sequential Lock保护的数据之间的happens bofore语义。

4 Reference
   Linux Kernel Development 3rd Edition, Robert Love

6
2
分享到:
评论

相关推荐

    Lock-in Amplifier.pdf

    significance of a lock-in amplifier. As an introduction to the subject there follows a simple intuitive account biased towards light measurement applications. All lock-in amplifiers, whether ...

    RedisLock.java

    RedisLock.java

    DistributedLock.java

    DistributedLock.java

    Doorlock.java

    Doorlock.java

    LocalLock.java

    LocalLock.java

    Thinking in Java 习题答案

    6. **多线程**:Java提供了丰富的API来支持并发编程,如Thread类、synchronized关键字、volatile变量、Lock接口等。习题会涵盖同步控制、线程通信等复杂问题。 7. **输入/输出(I/O)**:Java的I/O系统包括文件操作、...

    thinking in java 文档

    《Thinking in Java》是Bruce Eckel的经典著作,它深入浅出地介绍了Java编程语言的核心概念和技术,对于初学者和有经验的程序员都是极好的学习资源。文档内容涵盖了许多关键知识点,包括但不限于: 1. **基础语法**...

    0.84-THz Imaging Pixel with a Lock-in Amplifier in CMOS

    integrated with an analog lock-in amplifier in 130-nm bulk CMOS. The integrated lock-in amplifier can support a modulation frequency of up to 10MHz with a gain of 54dB, a dynamic range of 42dB, and an...

    The Thinking in Java Annotated Solution Guide

    《The Thinking in Java》是 Bruce Eckel 所著的一本经典Java编程教材,以其深入浅出的讲解方式深受程序员喜爱。这本书旨在引导读者深入理解Java语言的核心概念和机制,不仅覆盖了基础语法,还包括高级特性如多线程...

    thinking in java4 源码

    《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地介绍了Java语言的核心概念和技术。这本书的第四版更是被广大Java开发者视为学习和进阶的重要参考资料。源码是书中理论知识的实践体现,通过阅读和理解...

    java的Lock锁原理详解.docx

    在Java中,有两种主要的锁机制:synchronized和Lock。它们都是用来实现线程同步,防止数据竞争,确保并发环境下的数据一致性。 首先,synchronized是Java的关键字,由JVM直接支持,其底层实现依赖于操作系统原语,...

    Think In Java 4(完美高清中文版).

    5. **多线程篇**:介绍Java并发编程的基础,包括线程的创建、同步机制(如synchronized关键字和Lock接口)以及并发工具类,如Semaphore、ExecutorService等。 6. **输入/输出篇**:探讨Java的I/O流系统,包括文件I/...

    Thinking in Java知识点总结

    《Thinking in Java》是 Bruce Eckel 的经典著作,其中第21章主要讲解了Java中的并发编程知识。并发编程是让程序在多个线程中同时执行任务,以提高程序的效率和响应性。以下是该章节的重点知识点: 1. **并发的多面...

    JAVA Lock加锁实例

    Lock锁是对象锁,仅在同一对象中,锁才会生效。(不做论证) (以下场景皆为单例模式下运行) lock.lock()的加锁方式,会使后续请求的线程堵塞等待。(方案A) lock.tryLock()的加锁方式,不会堵塞,会立即返回加锁...

    Lock in filter.rar_NOISE_dynamic signal_flicker noise_lock in_we

    It is oriented to get a better comprehension of the Lock-in amplifier, including its features and limitations. It has been defined to learn how to model a lock-in amplifier, a photo-detector, ...

    LOCK_ST.ZIP_Start Button Lock_lock in

    总结来说,"Start Button Lock_lock in"是一个涉及C# Compact Framework、用户界面编程、系统钩子、访问控制以及状态持久化的复杂功能。它在保护设备安全、防止非法操作方面具有重要意义,尤其在公共设备和企业环境...

    Data Structures and Algorithms in Java

    《Data Structures and Algorithms in Java》是一本专注于Java编程语言中的数据结构与算法的权威书籍,由Michael T. Goodrich和Roberto Tamassia合著,第五版提供了全面且深入的讲解。这本书对于学习和理解如何在...

Global site tag (gtag.js) - Google Analytics