Java多线程编程中线程锁与读写锁的使用示例

 更新时间:2016年04月24日 08:53:07   投稿:goldensun  
这篇文章主要介绍了Java多线程编程中线程锁与读写锁的使用示例,锁是控制程序多线程并发的重要手段,需要的朋友可以参考下

线程锁Lock
Lock  相当于 当前对象的 Synchronized

import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 
/* 
 * Lock lock = new ReentrantLock(); 
 * lock.lock();  lock.unLock(); 
 * 类似于 synchronized,但不能与synchronized 混用 
 */ 
public class LockTest { 
  public static void main(String[] args) { 
    final Outer outer = new LockTest().new Outer(); 
    new Thread(new Runnable() { 
 
      @Override 
      public void run() { 
        // TODO Auto-generated method stub 
        while (true) { 
          outer.out1("zhangxiaoxiao"); 
          outer.out2("lihuoming"); 
        } 
      } 
 
    }).start(); 
    new Thread(new Runnable() { 
 
      @Override 
      public void run() { 
        // TODO Auto-generated method stub 
        while (true) { 
          outer.out1("zhangxiaoxiao"); 
          outer.out2("lihuoming"); 
        } 
      } 
 
    }).start(); 
 
  } 
  class Outer { 
    Lock lock = new ReentrantLock(); 
    void out1(String name) { 
      lock.lock(); 
      int len = name.length(); 
      for (int i = 0; i < len; i++) { 
        System.out.print(name.charAt(i)); 
      } 
      System.out.println(); 
      lock.unlock(); 
    } 
    void out2(String name) { 
      lock.lock(); 
      int len = name.length(); 
      for (int i = 0; i < len; i++) { 
        System.out.print(name.charAt(i)); 
      } 
      System.out.println(); 
      lock.unlock(); 
    } 
  } 
} 


读写锁 ReentrantReadWriteLock

 读写锁:允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写

import java.util.HashMap; 
import java.util.Map; 
import java.util.concurrent.locks.ReadWriteLock; 
import java.util.concurrent.locks.ReentrantReadWriteLock; 
/* 
 * 问题:设计一个 缓存机制 的 伪代码 
 *  从集合中读取数据,读取不到,就写入,再考虑多线程并发的情况  
 */ 
public class ReadWriteLockTest2 { 
  private Map<String, Object> data = new HashMap<String, Object>(); 
  private ReadWriteLock lock = new ReentrantReadWriteLock();  
  //读写锁 
  public Object getInstance1(String key, Object obj) { 
    lock.readLock().lock(); 
    Object value = null; 
    try { 
      value = data.get(key); 
      if (value == null) {//一条线程进入这里, 
        lock.readLock().unlock();//读锁解了,其他线程就可能也到这了 
        lock.writeLock().lock();//只能有一条线程到这,写锁开启,要写入数据了 
        if (data.get(key) == null) { 
          value = obj;   
            /*先判断数据,如果不存在,才写入,,因为 界时当写锁解除后,其他 
              线程,再想写入时, 判断到数据存在 ,就跳过了。就不会发生同时写入的情况 
            */    
          data.put(key, value);  
        } 
        lock.writeLock().unlock();//写完了,解锁 
        lock.readLock().lock(); 
      } 
    } finally { 
      lock.readLock().unlock(); 
    }   
    return value; 
  } 

相关文章

  • spring boot启动时mybatis报循环依赖的错误(推荐)

    spring boot启动时mybatis报循环依赖的错误(推荐)

    今天小编抽时间给大家分享spring boot启动时mybatis报循环依赖的错误,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-12-12
  • 那些年用httpclient时踩过的一些坑

    那些年用httpclient时踩过的一些坑

    这篇文章主要给大家介绍了关于那些年用httpclient时踩过的一些坑,文中通过示例代码介绍的非常详细,对大家学习或者使用httpclient具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Sharding JDBC读写分离实现原理及实例

    Sharding JDBC读写分离实现原理及实例

    这篇文章主要介绍了Sharding JDBC读写分离实现原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Spring入门到精通之注解开发详解

    Spring入门到精通之注解开发详解

    Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势。本文将通过示例为大家详细讲讲Spring如何实现注解开发,感兴趣的可以学习一下
    2022-07-07
  • 识别率很高的java文字识别技术

    识别率很高的java文字识别技术

    这篇文章主要为大家详细介绍了识别率很高的java文字识别技术,亲测,希望对大家有帮助,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Jersey框架的统一异常处理机制分析

    Jersey框架的统一异常处理机制分析

    初学者往往不清楚java的异常为什么会设计成这个样子,他们通常会对异常只进行简单的处理
    2016-07-07
  • 解读Spring-Context的作用及用法

    解读Spring-Context的作用及用法

    这篇文章主要介绍了Spring-Context的作用及用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Netty分布式FastThreadLocal的set方法实现逻辑剖析

    Netty分布式FastThreadLocal的set方法实现逻辑剖析

    这篇文章主要为大家介绍了Netty分布式FastThreadLocal的set方法实现逻辑剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • SpringBoot 整合Redis 数据库的方法

    SpringBoot 整合Redis 数据库的方法

    Redis是一个基于内存的日志型可持久化的缓存数据库,保存形式为key-value格式,Redis完全免费开源,它使用ANSI C语言编写。这篇文章主要介绍了SpringBoot 整合Redis 数据库的方法,需要的朋友可以参考下
    2018-03-03
  • Java读取OpenSSL生成的PEM公钥文件操作

    Java读取OpenSSL生成的PEM公钥文件操作

    这篇文章主要介绍了Java读取OpenSSL生成的PEM公钥文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论