Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:

这样就实现了和sychronized一样的同步效果,需要注意的是,用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而用Lock需要我们手动释放锁,所以为了保证锁最终被释放(发生异常情况),要把互斥区放在try内,释放锁放在finally内

如果说这就是Lock,那么它不能成为同步问题更完美的处理方式,下面要介绍的是读写锁(ReadWriteLock),我们会有一种需求,在对数据进行读写的时候,为了保证数据的一致性和完整性,需要读和写是互斥的,写和写是互斥的,但是读和读是不需要互斥的,这样读和读不互斥性能更高些。

 
 class Data {
private int data;// 共享数据
private ReadWriteLock rwl = new ReentrantReadWriteLock();
public void set(int data) {
rwl.writeLock().lock();// 取到写锁
try {
System.out.println(Thread.currentThread().getName() + "准备写入数据");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.data = data;
System.out.println(Thread.currentThread().getName() + "写入" + this.data);
} finally {
rwl.writeLock().unlock();// 释放写锁
}
}
public void get() {
rwl.readLock().lock();// 取到读锁
try {
System.out.println(Thread.currentThread().getName() + "准备读取数据");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "读取" + this.data);
} finally {
rwl.readLock().unlock();// 释放读锁
}
}
}

部分输出结果:

  1. Thread-4准备读取数据
  2. Thread-3准备读取数据
  3. Thread-5准备读取数据
  4. Thread-5读取18
  5. Thread-4读取18
  6. Thread-3读取18
  7. Thread-2准备写入数据
  8. Thread-2写入6
  9. Thread-2准备写入数据
  10. Thread-2写入10
  11. Thread-1准备写入数据
  12. Thread-1写入22
  13. Thread-5准备读取数据

从结果可以看出实现了我们的需求,这只是锁的基本用法,锁的机制还需要继续深入学习。

本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7461369,转载请注明。

最新文章

  1. SQL:插入指定标识列的数据时候的小错误
  2. thinkphp 介绍
  3. 爱上MVC~为CheckBoxFor和RadioButtonFor加个扩展方法吧(希望MVC5把这方法收纳——呵呵)
  4. MongoDB 副本集的原理、搭建、应用
  5. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
  6. js实现表格信息的删除和添加
  7. linux下网卡启动、配置
  8. Git之基本命令
  9. android 自定义标题栏 titleBar自定义
  10. Ubuntu上VNC 配置
  11. [转]Laravel 4之控制器
  12. 添加一个Application Framework Service
  13. 为什么总是要求使用position的时候父类是relative
  14. windows下,读取快捷方式lnk所指向的路径
  15. 手机端两端对齐,兼容ios,安卓
  16. Nero8刻录引导系统光盘镜像图文教程
  17. sqlserver(查看被锁进程)
  18. Linux 下压缩与解压.zip和.rar
  19. 046 Oracle执行慢的SQL
  20. 利用ONENET平台透传电脑截图

热门文章

  1. 一个罕见的MSSQL注入漏洞案例
  2. SDL封装的系统操作(转载)
  3. LCD时序中设计到的VSPW/VBPD/VFPD/HSPW/HBPD/HFPD总结【转】
  4. oracle11g的冷热备份
  5. javascript本地缓存方案-- 存储对象和设置过期时间
  6. excl筛选求和
  7. ROS数据可视化工具Rviz和三维物理引擎机器人仿真工具V-rep Morse Gazebo Webots USARSimRos等概述
  8. SQL Server数据库存在判断语句及系统表简介
  9. spring-boot分环境打包为tar包
  10. Hive(七)Hive分析窗口函数