1.面试题1:三个线程读,三个线程写同一个数据

public class ReadWriteLockTest {

    public static void main(String[] args) {
final Queue3 q3 = new Queue3();
for(int i=0;i<3;i++){
//3个读线程
new Thread(new Runnable() {
@Override
public void run() {
while(true){
q3.get();
}
}
}).start();
//3个写线程
new Thread(new Runnable() {
@Override
public void run() {
q3.set(new Random().nextInt(10000));
}
}).start();
}
}
} class Queue3{
private Object data = null; //共享数据,只能有一个线程能写该数据,但可以有多个线程同时读
ReadWriteLock lock = new ReentrantReadWriteLock();
public void get(){
try {
lock.readLock().lock();
System.out.println(Thread.currentThread().getName()+" be ready to read data!");
Thread.sleep((long)(Math.random()*1000));
System.out.println(Thread.currentThread().getName()+" have read data: "+data);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.readLock().unlock();
}
}
public void set(Object data){
try {
lock.writeLock().lock();
System.out.println(Thread.currentThread().getName()+" be ready to write data!");
Thread.sleep((long)(Math.random()*1000));
this.data = data;
System.out.println(Thread.currentThread().getName()+" hava write data: "+data);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.writeLock().unlock();
} } }

2.

  Hibernate中两者的区别

  ① User user = session.load(id,User.class);

  ② User user = session.get(id,User.class);

其中②直接从数据库查询,如果查询为空,user为null

其中①在查询时,无论数据路有没有都会得到:User$Proxy 代理类,是一个缓存的User

如果实际的realUser为空则查询数据库,如果从数据库查询出的为空,抛异常,如果不为空

直接返回realUser.getName()  

User$Proxy extends User{
private Integer id = id;
User realUser = null;
    getName(){
        if(realUser == null){
          realUser = session.get(id);
          if(realUser == null)
          throw exception //抛异常
        }
      return realUser.getName();
    }
}

3.javaAPI 上的一段代码:

 Sample usages. Here is a code sketch showing how to exploit reentrancy to perform lock downgrading after updating a cache (exception handling is elided for simplicity): 

  class CachedData {
Object data;
volatile boolean cacheValid;
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { //处理数据
rwl.readLock().lock(); //多个线程并发读,不冲突,只需要上一个读锁
if (!cacheValid) { //检查缓存中有没有数据 if中的代码好比第一次获取数据
// Must release read lock before acquiring write lock
rwl.readLock().unlock(); //如果一个线程发现没有数据,释放读锁,获取写锁
rwl.writeLock().lock();
// Recheck state because another thread might have acquired
// write lock and changed state before we did.
if (!cacheValid) {
data = ... //实际的写数据逻辑
cacheValid = true; //缓存标志改为true,表示有缓存数据了
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
rwl.writeLock().unlock(); // Unlock write, still hold read
} use(data); //使用数据
rwl.readLock().unlock();
}
}

4.面试题:设计一个缓存系统

 public class CacheDemo {

     private Map<String,Object> cache = new HashMap<>();
public static void main(String[] args) { } private ReadWriteLock rwl = new ReentrantReadWriteLock();
public Object getData(String key){
rwl.readLock().lock(); //获取读锁
Object value = null;
try {
value = cache.get(key);
if(value == null){
rwl.readLock().unlock();
rwl.writeLock().lock();
try {
if(value == null){
value = "aaa"; //实际是去数据库查询
}
} finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
rwl.readLock().unlock(); //释放读锁
}
return value;
} }

Lock读写锁技术的妙用的更多相关文章

  1. 多线程12_张孝祥 java5读写锁技术的妙用

    package locks; import java.util.Random; import java.util.concurrent.locks.ReentrantReadWriteLock; /* ...

  2. pthread中读写锁

    读写锁很像一个互斥量,他阻止多个线程同时修改共享数据的另一种方法,区分不同互斥量的是他是分读数据和写数据,一个读写锁允许同时多个线程读数据,只要他们不修改数据. 只要没有写模式下的加锁,任意线程都可以 ...

  3. 《java并发编程实战》读书笔记10--显示锁Lock,轮询、定时、读写锁

    第13章 显示锁 终于看到了这本书的最后一本分,呼呼呼,真不容易.其实说实在的,我不喜欢半途而废,有其开始,就一定要有结束,否则的话就感觉哪里乖乖的. java5.0之前,在协调对共享对象的访问时可以 ...

  4. 技术笔记:Delphi多线程应用读写锁

    在多线程应用中锁是一个很简单又很复杂的技术,之所以要用到锁是因为在多进程/线程环境下,一段代码可能会被同时访问到,如果这段代码涉及到了共享资源(数据)就需要保证数据的正确性.也就是所谓的线程安全.之前 ...

  5. 锁的封装 读写锁、lock

    最近由于项目上面建议使用读写锁,而去除常见的lock锁.然后就按照需求封装了下锁.以简化锁的使用.但是开发C#的童鞋都知道lock关键字用起太方便了,但是lock关键字不支持超时处理.很无奈,为了实现 ...

  6. Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁

    (1)synchronized 是互斥锁: (2)ReentrantLock 顾名思义 :可重入锁 (3)ReadWriteLock :读写锁 读写锁特点: a)多个读者可以同时进行读b)写者必须互斥 ...

  7. Spring data Jpa,Mybatis,读写锁,@Lock 使用

    Spring data jpa 支持注解式的读写锁(悲观锁),实际上这个东西硬编码也简单,但是基于Jpa 命名方式定义的Sql,只能用注解添加支持读写锁了, 不了解读写锁的可以点这里 mysql读写锁 ...

  8. 锁对象-Lock: 同步问题更完美的处理方式 (ReentrantReadWriteLock读写锁的使用/源码分析)

    Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...

  9. 读写锁(read-write lock)机制-----多线程同步问题的解决

    原文: http://blog.chinaunix.net/uid-27177626-id-3791049.html ----------------------------------------- ...

随机推荐

  1. linux下sendmail邮件系统安装操作记录

    电子邮件系统的组成:1)邮件用户代理(Mail User Agent , MUA),MUA是一个邮件系统的客户端程序,它提供了阅读,发送和接受电子邮件的用户接口. 最常用的 MUA 有: linux ...

  2. memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法

    1 网络IO模型 安装memcached需要先安装libevent Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描 ...

  3. html代码中显示系统时间

    可以显示系统的静态时间和动态时间 1,静态时间 <script type="text/javascript"> var myDate = new Date(); doc ...

  4. Github 简明教程

    http://www.runoob.com/w3cnote/git-guide.html http://rogerdudler.github.io/git-guide/index.zh.html

  5. VS清除打开项目时的TFS版本控制提示

    原文:http://blog.useasp.net/archive/2015/12/15/how-to-permanently-remove-vs-project-TFS-source-version ...

  6. Android开发之旅: Intents和Intent Filters(理论部分)

    引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...

  7. 如何让jboss eap 6.2+ 的多个war应用共享 jar 包?

    weblogic有一个很贴心的功能,允许把多个war应用共同依赖的jar包,打包一个单独的war,以libary方式部署,然后各应用在weblogic.xml里声明引用该libary即可,这样可大大减 ...

  8. 2016古装动作喜剧《笨贼别跑》HD720P.国语中字

    导演: 雷金克编剧: 郭卫鹏 / 李诗怡 / 马强主演: 彭波 / 李添诺 / 董向荣 / 韩丰 / 董怡君类型: 喜剧 / 动作 / 古装制片国家/地区: 中国大陆语言: 汉语普通话上映日期: 20 ...

  9. Java7并发编程实战(一) 守护线程的创建和运行

    Java里有一种特殊的线程叫做守护(Daemon)线程,这种线程的优先级很低,通常来说,当一个应用程序里面没有其他线程运行的时候,守护线程才运行,当线程是程序中唯一运行的线程时,守护线程执行结束后,J ...

  10. ViewModelBase && ObservableObject

    ViewModelBase && ObservableObject 在Mvvm中,ViewModel和Model都需要具有通知界面更新数据的能力,这都要借助于WPF中的 INotify ...