- 浏览: 399103 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (285)
- test (0)
- 分类 (1)
- java (281)
- tttttttttttt (1)
- android程序复制数据库 (1)
- Hibernate 动态 HQL (1)
- java编写扑克的洗牌程序 (1)
- NIO 之 选择就绪模式 (1)
- wpo另类问题:不可轻视的蜘蛛爬行对服务器造成的负担 (1)
- haml (1)
- cvcvcvc (1)
- 开源史上最成功的8个开源产品 (1)
- XML文件转换成Word文件或者Excel文件 (1)
- 一些利用开源浏览器核心开发专用浏览器的连接 (1)
- 毛笔效果简单思路 (1)
- 年终考评以后 (1)
- RFC821 简单邮件传输协议(SMTP)中文定义文档 (1)
- JNI中jstring类型与c语言中的字符串的转换 (1)
- 极限编程(XP)的重构与设计模式 (1)
- MapInfo2005年第三期电子新闻 (1)
- 想到目前各BLOG站点和搜索引擎的一点点缺陷 (1)
- 成功通过DB2的700和701考试 (1)
- 基于记录登陆信息的防止网页暴力破解方法 (1)
- Router路由 (1)
- 终于稍微完整的学习了一下Linux (1)
- android手机通讯录备份还原代码 (1)
- Qt之美(一):d指针/p指针详解 (1)
- DB2 静默安装 (1)
- linux开机启动脚本的顺序 (1)
- Hibernate实体对象的三种状态 (1)
- Hibernate面向对象的hql语句 (1)
- ibatIS调用存储过程 (1)
- Linux启动过程(详细说明) (1)
- C3P0配置 (1)
- memcache安装 (1)
- js event.keyCode (1)
- java获取汉子首字母 (1)
- Eclipse GC log (1)
- java轻量级httpserver (1)
最新评论
-
smilea001:
我知道了,作者采用的是gbk编码,我采用的是utf-8编码,
java获取汉子首字母 -
smilea001:
我输入的也是--
java获取汉子首字母 -
di1984HIT:
写的不错啊。
Router路由 -
kaixinyou:
...
2011.07.20——— android 获得当前view在屏幕的坐标 -
zhengjianbo:
你好,可以将你的实现代码公布下吗!万分感谢!
毛笔效果简单思路
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
发表评论
-
java轻量级httpserver
2012-02-08 11:48 1639httpclient+httpserver demo ... -
Eclipse GC log
2012-02-04 16:59 1479为了查看Eclipse GC log,需要在eclip ... -
java获取汉子首字母
2012-02-03 09:14 1568public class StringUtil { ... -
js event.keyCode
2012-02-03 09:09 1256<span style="" ... -
memcache安装
2012-02-02 12:04 1212? <blockquote> 1. ... -
C3P0配置
2012-02-02 11:34 1031cquireIncrement[3] ... -
Linux启动过程(详细说明)
2012-02-01 09:09 1624<div class="post ... -
ibatIS调用存储过程
2012-01-31 15:38 1646<p>一、ibatIS调用存储过程(调用存 ... -
Hibernate面向对象的hql语句
2012-01-11 13:14 1036Hibernate中hql条件语句的书写方式有: ? ... -
Hibernate实体对象的三种状态
2012-01-11 12:59 1318<p style="text- ... -
linux开机启动脚本的顺序
2011-12-21 15:14 1162下开机自动启动脚本所涉及的知识和方法、如下: ... -
DB2 静默安装
2011-12-21 11:59 1113<span style="color: ... -
Qt之美(一):d指针/p指针详解
2011-12-20 15:14 2056[/b]2011.11.16 [size=18px;] ... -
android手机通讯录备份还原代码
2011-12-20 11:54 2989<span style="font-f ... -
终于稍微完整的学习了一下Linux
2011-12-19 12:14 1209Linux以前也装过两次,不过几乎没去用。头几天看一些 ... -
Router路由
2011-12-19 10:54 1235Router路由:设定线的轨迹,在Connection ... -
基于记录登陆信息的防止网页暴力破解方法
2011-12-17 10:49 1467对黑客方面比较感兴趣的或者是比较熟悉的,应该知道溯雪这 ... -
成功通过DB2的700和701考试
2011-12-16 17:27 909嘿嘿,原以为比较没有信心的701考试也被俺成功的攻克了 ... -
想到目前各BLOG站点和搜索引擎的一点点缺陷
2011-12-15 15:54 911感觉无聊,就到中国博客网的首页逛了逛,想看看有没有什么 ... -
MapInfo2005年第三期电子新闻
2011-12-15 10:49 952<span lang="EN-US&q ...
相关推荐
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
DistributedLock.java
Doorlock.java
LocalLock.java
6. **多线程**:Java提供了丰富的API来支持并发编程,如Thread类、synchronized关键字、volatile变量、Lock接口等。习题会涵盖同步控制、线程通信等复杂问题。 7. **输入/输出(I/O)**:Java的I/O系统包括文件操作、...
《Thinking in Java》是Bruce Eckel的经典著作,它深入浅出地介绍了Java编程语言的核心概念和技术,对于初学者和有经验的程序员都是极好的学习资源。文档内容涵盖了许多关键知识点,包括但不限于: 1. **基础语法**...
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》是 Bruce Eckel 所著的一本经典Java编程教材,以其深入浅出的讲解方式深受程序员喜爱。这本书旨在引导读者深入理解Java语言的核心概念和机制,不仅覆盖了基础语法,还包括高级特性如多线程...
### Java的Lock接口详解 #### 一、Lock接口概述 `Lock`接口是Java并发编程中的一个重要组成部分,它提供了一种更加灵活的方式来控制对共享资源的访问。与传统的`synchronized`关键字相比,`Lock`提供了更强大的...
“java-leetcode题解之Open the Lock.java”指的是使用Java语言编写的一段代码,用于解决LeetCode平台上“打开转盘锁”的题目。这篇题解可能包含了Java的类定义、方法实现、以及可能用到的辅助类或数据结构。该代码...
《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地介绍了Java语言的核心概念和技术。这本书的第四版更是被广大Java开发者视为学习和进阶的重要参考资料。源码是书中理论知识的实践体现,通过阅读和理解...
Lock-in amplifiers were invented in the 1930’s [1, 2, 3] and commercialized [4] in the mid 20th century as electrical instruments capable of extracting signal amplitudes and phases in extremely ...
在Java中,有两种主要的锁机制:synchronized和Lock。它们都是用来实现线程同步,防止数据竞争,确保并发环境下的数据一致性。 首先,synchronized是Java的关键字,由JVM直接支持,其底层实现依赖于操作系统原语,...
5. **多线程篇**:介绍Java并发编程的基础,包括线程的创建、同步机制(如synchronized关键字和Lock接口)以及并发工具类,如Semaphore、ExecutorService等。 6. **输入/输出篇**:探讨Java的I/O流系统,包括文件I/...
《Thinking in Java》是 Bruce Eckel 的经典著作,其中第21章主要讲解了Java中的并发编程知识。并发编程是让程序在多个线程中同时执行任务,以提高程序的效率和响应性。以下是该章节的重点知识点: 1. **并发的多面...
Lock锁是对象锁,仅在同一对象中,锁才会生效。(不做论证) (以下场景皆为单例模式下运行) lock.lock()的加锁方式,会使后续请求的线程堵塞等待。(方案A) lock.tryLock()的加锁方式,不会堵塞,会立即返回加锁...
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, ...
总结来说,"Start Button Lock_lock in"是一个涉及C# Compact Framework、用户界面编程、系统钩子、访问控制以及状态持久化的复杂功能。它在保护设备安全、防止非法操作方面具有重要意义,尤其在公共设备和企业环境...