java锁对象
在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks 包下面,里面有三个重要的接口Condition、Lock、ReadWriteLock。
Condition:
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。
Lock:
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。
ReadWriteLock:
ReadWriteLock 维护了一对相关的锁定,一个用于只读操作,另一个用于写入操作。
有关锁的介绍,API文档解说很多,看得很烦,还是看个例子再看文档比较容易理解。

package cn.thread; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
*
*
* @author 林计钦
* @version 1.0 2013-7-25 上午10:33:37
*/
public class LockTest {
public static void main(String[] args) {
LockTest test = new LockTest(); // 创建并发访问的账户
MyCount myCount = test.new MyCount("95599200901215522", 10000);
// 创建一个锁对象
Lock lock = new ReentrantLock();
// 创建一个线程池
ExecutorService pool = Executors.newCachedThreadPool();
// 创建一些并发访问用户,一个信用卡,存的存,取的取,好热闹啊
User u1 = test.new User("张三", myCount, -4000, lock);
User u2 = test.new User("张三他爹", myCount, 6000, lock);
User u3 = test.new User("张三他弟", myCount, -8000, lock);
User u4 = test.new User("张三", myCount, 800, lock);
// 在线程池中执行各个用户的操作
pool.execute(u1);
pool.execute(u2);
pool.execute(u3);
pool.execute(u4);
// 关闭线程池
pool.shutdown();
} /**
* 信用卡的用户
*/
class User implements Runnable {
private String name; // 用户名
private MyCount myCount; // 所要操作的账户
private int iocash; // 操作的金额,当然有正负之分了
private Lock myLock; // 执行操作所需的锁对象 User(String name, MyCount myCount, int iocash, Lock myLock) {
this.name = name;
this.myCount = myCount;
this.iocash = iocash;
this.myLock = myLock;
} public void run() {
String string;
if(iocash>0){
string="存款";
}else{
string="取款";
} // 获取锁
myLock.lock();
// 执行现金业务
System.out.println(name + "正在操作" + myCount + "账户," +
string+"金额为" + iocash + ",当前金额为" + myCount.getCash());
myCount.setCash(myCount.getCash() + iocash);
System.out.println(name + "操作" + myCount + "账户成功,"+
string + "金额为" + iocash + ",当前金额为" + myCount.getCash());
System.out.println("============");
// 释放锁,否则别的线程没有机会执行了
myLock.unlock();
}
} /**
* 信用卡账户,可随意透支
*/
class MyCount {
private String oid; // 账号
private int cash; // 账户余额 MyCount(String oid, int cash) {
this.oid = oid;
this.cash = cash;
} public String getOid() {
return oid;
} public void setOid(String oid) {
this.oid = oid;
} public int getCash() {
return cash;
} public void setCash(int cash) {
this.cash = cash;
} @Override
public String toString() {
return "MyCount{" + "账号='" + oid + '\'' + ", 余额=" + cash + '}';
}
}
}


张三正在操作MyCount{账号='95599200901215522', 余额=10000}账户,取款金额为-4000,当前金额为10000
张三操作MyCount{账号='95599200901215522', 余额=6000}账户成功,取款金额为-4000,当前金额为6000
============
张三他弟正在操作MyCount{账号='95599200901215522', 余额=6000}账户,取款金额为-8000,当前金额为6000
张三他弟操作MyCount{账号='95599200901215522', 余额=-2000}账户成功,取款金额为-8000,当前金额为-2000
============
张三他爹正在操作MyCount{账号='95599200901215522', 余额=-2000}账户,存款金额为6000,当前金额为-2000
张三他爹操作MyCount{账号='95599200901215522', 余额=4000}账户成功,存款金额为6000,当前金额为4000
============
张三正在操作MyCount{账号='95599200901215522', 余额=4000}账户,存款金额为800,当前金额为4000
张三操作MyCount{账号='95599200901215522', 余额=4800}账户成功,存款金额为800,当前金额为4800
============

从上面的输出可以看到,利用锁对象太方便了,比直接在某个不知情的对象上用锁清晰多了。
但一定要注意的是,在获取了锁对象后,用完后应该尽快释放锁,以便别的等待该锁的线程有机会去执行。
java锁对象的更多相关文章
- Java锁对象和条件对象的使用
锁对象 临界区:临界区是一个特殊的代码段,该代码段访问某种特殊的公共资源,该资源同一时间只允许一个线程使用. Java中可以使用锁对象创造一个临界区: myLock.lock(); try { 关键代 ...
- Java锁Synchronized对象锁和类锁区别
java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...
- java的对象锁和类锁
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...
- (转)java 多线程 对象锁&类锁
转自:http://blog.csdn.net/u013142781/article/details/51697672 最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不 ...
- Java synchronized对象级别与类级别的同步锁
Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块.同步代码块是指同一时间只能有一个线程执行的代码,并且执行该代码的线程持有同步锁.synchronized关键字可 ...
- 个人对java中对象锁与类锁的一些理解与实例
一 什么是对象锁 对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,所有它只会锁住当前的对象,而并不会对其他对象实例的锁产生任何影响,不同对象访问同一个 ...
- Java 学习笔记之 Synchronized锁对象
Synchronized锁对象: Synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,那么其 ...
- java 锁!
问题:如何实现死锁. 关键: 1 两个线程ta.tb 2 两个对象a.b 3 ta拥有a的锁,同时在这个锁定的过程中,需要b的锁:tb拥有b的锁,同时在这个锁定的过程中,需要a的锁: 关键的实现难点是 ...
- 【翻译十八】java-并发之锁对象
Lock Objects Synchronized code relies on a simple kind of reentrant lock. This kind of lock is easy ...
随机推荐
- 获取file中字段,写入到TXT文件中
一下代码省略了很多,哈哈哈 a.txt文件 uid,type,pointx,pointy,name1,9,911233763,543857286,区间测速起点3,9,906371086,5453354 ...
- C++ Primer读书笔记
以前阅读学习C++ Primer时的习题代码(当时代码风格格式比较渣): https://github.com/liyuan989/exercise/tree/master/c%2B%2B%20pri ...
- Atom:优雅迷人的编辑神器
对于热爱markdown写作的人来说,Atom同样是一款拥有无穷魅力的写作软件.我不怕它无法满足你的需求,就怕你不给一个机会了解它,那么,这将是一场遗憾的错过. 大学的时候,坊间对那些编程高手有一个令 ...
- Xcode7 iOS9.0 的真机调试
Xcode7的真机调试: 1.Xcode偏好 -> 账号 -> 增加 Apple ID ->显示 free 2.Target 运行 iOS 版本号 3.修正 Team 项 选择 ...
- DNS解析原理与Bind部署DNS服务
DNS是什么? DNS(Domain Name System,域名系统)是互联网上最核心的带层级的分布式系统,它负责把域名转换为IP地址.反查IP到域名的反向解析以及宣告邮件路由等信息,使得基于域名提 ...
- 使用 Visual Studio 部署 .NET Core 应用 ——.Net Core 部署到SUSE Linux Enterprise Server 12 SP2 64 位(GNOME 版本3.20.2)
SUSE Linux安装 apache 命令:sudo zypper in apache 设置apache 服务可用 命令:sudo systemctl enable apache2.service启 ...
- hdu 4240(最大流+最大流量的路)
Route Redundancy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- memcached安装+绑定访问ip
安装: 1.由于memcached是基于libevent的,需要安装libevent,libevent-devel $yum -y install libevent libevent-devel 2. ...
- PHP需要学习成长路径
第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在PHP中型系统中支 ...
- 关于rem的一点总结【原创】
关于rem的一点总结 最近在写一个关于小说阅读的webApp,由于没有借用任何框架,所以很多底层的内容都需要自己去解决,幸好的是这次只是关于移动端的内容,还不至于去向着jquery的方向码代码.言归正 ...