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 ...
随机推荐
- 1438. Shopaholic
Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Lindsay is a shopaholic. Whenever th ...
- 【sam复习】用sam实现后缀排序
没错,一定是无聊到一定境界的人才能干出这种事情. 这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试. 我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix ...
- freemark基础知识
前言:使用freemarker对应生成一个html文件,保存到磁盘,访问文件就不一定使用tomcat,可以使用nginx(http服务器)访问.可以使用freemaker工具生成.只生成一次,html ...
- The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collectio
The content of element type "resultMap" must match "(constructor?,id*,result*,associa ...
- keil问题:Error: failed to execute 'C:\Keil\ARM\BIN\ArmCC'
1.打开cmd,进入相应的路径下 cd C:\Keil\ARM\BIN\ 输入 armcc 若显示如下界面则说明keil已经注册 2.若注册成功还没解决问题,则说明软件是在网上下载的破解版的,建议卸 ...
- ArcGIS Server 基于Token安全验证
写在前面:只使用token并不能起到安全验证的作用,ArcGIS Server文件夹的权限是开放的,我们不需要登录Server平台即可访问服务,所以我们应该将Token验证和文件夹的安全性结合起来使用 ...
- PHP的数据类型
原始类型共8种: 1, 4种标量类型:boolean(布尔型).integer(整形).float/double(浮点型).string(字符串型): 2, 2种复合型:array(数组).o ...
- ES6 一种新的数据结构--Map跟Objct的区别
var map1=new Map(); var keys={key:'val'}; map1.set(keys,'content'); ==> {Object {key: "val&q ...
- 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. "机器学习方法"系列,我本着开放与共享(open and share)的精神撰写,目的是 ...
- window下线程同步之(Semaphores(信号量))
HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes _In_ LONG lIniti ...