java锁Lock的应用

package jun.lock;

public class BankCard {

	protected String cardId;//银行卡号

	protected int balance = 8000;//余额

	public String getCardId() {
		return cardId;
	}

	public void setCardId(String cardId) {
		this.cardId = cardId;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}
}

package jun.lock;

import java.util.concurrent.locks.Lock;

public class InCome implements Runnable{

	Lock lock  = null;
	BankCard card = null;

	public InCome(Lock lock, BankCard card){
		this.lock = lock;
		this.card = card;
	}

	@Override
	public void run() {
		try {
			while(true){
				lock.lock();
				System.out.print("当前余额:" + card.getBalance());  
                card.setBalance(card.getBalance() + 9000);  
                System.out.println("收入9000元,余额::" + card.getBalance());
                lock.unlock();
                Thread.sleep(3 * 1000); 
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally {

		}

	}

}

package jun.lock;

import java.util.concurrent.locks.Lock;

public class OutCome implements Runnable{

	Lock lock  = null;
	BankCard card = null;

	public OutCome(Lock lock, BankCard card){
		this.lock = lock;
		this.card = card;
	}

	@Override
	public void run() {
		try {
			while(true){
				lock.lock();
				System.out.print("当前余额:" + card.getBalance());  
                card.setBalance(card.getBalance()-2500);  
                System.out.println("消费2500,现在余额::" + card.getBalance());
                lock.unlock();
                Thread.sleep(1 * 1000); 
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally {

		}

	}

}

package jun.lock;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 
 * java锁的应用
 * 
 * @author xiejunbo
 *
 */
public class TestLock {

	public static void main(String args[]) {
		BankCard card = new BankCard();
		Lock lock = new ReentrantLock();
		ExecutorService pool = Executors.newCachedThreadPool();

		//把锁对象传进线程,线程对对象进行锁定和解锁
		InCome in = new InCome(lock, card);
		OutCome out = new OutCome(lock, card);

		pool.execute(in);
		pool.execute(out);
		pool.shutdown();
	}

}

运行结果:
当前余额:8000收入9000元,余额::17000
当前余额:17000消费2500,现在余额::14500
当前余额:14500消费2500,现在余额::12000
当前余额:12000消费2500,现在余额::9500
当前余额:9500收入9000元,余额::18500
当前余额:18500消费2500,现在余额::16000
当前余额:16000消费2500,现在余额::13500
当前余额:13500消费2500,现在余额::11000
当前余额:11000收入9000元,余额::20000
当前余额:20000消费2500,现在余额::17500
当前余额:17500消费2500,现在余额::15000
当前余额:15000消费2500,现在余额::12500
当前余额:12500收入9000元,余额::21500
当前余额:21500消费2500,现在余额::19000
当前余额:19000消费2500,现在余额::16500
当前余额:16500消费2500,现在余额::14000
时间: 2024-10-03 00:21:22

java锁Lock的应用的相关文章

java 锁 Lock接口详解

一:java.util.concurrent.locks包下常用的类与接口(lock是jdk 1.5后新增的) (1)Lock和ReadWriteLock是两大锁的根接口,Lock代表实现类是ReentrantLock(可重入锁),ReadWriteLock(读写锁)的代表实现类是ReentrantReadWriteLock. Lock 接口支持那些语义不同(重入.公平等)的锁规则,可以在非阻塞式结构的上下文(包括 hand-over-hand 和锁重排算法)中使用这些规则.主要的实现是 Ree

Java锁----Lock实现原理

Lock完全用Java写成,在java这个层面是无关JVM实现的. 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock.ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小异,因此我们以ReentrantLock作为讲解切入点. 1. ReentrantLock的调用过程 经过

java并发 lock锁

Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述.本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包

Java同步锁——lock与synchronized 的区别【转】

一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将 unLock()放到finally{} 中: 2)synchronized在发生异常时,会

锁 Lock

锁 Lock java.util.concurrent.locks.Lock 是一个类似于 synchronized 块的线程同步机制.但是 Lock 比 synchronized 块更加灵活.精细. 既然 Lock 是一个接口, 首先创建了一个 Lock 对象.之后调用了它的 lock() 方法.这时候这个 lock 实例就被锁住啦.任何其他再过来调用 lock() 方法的线程将会被阻塞住,直到锁定 lock 实例的线程调用了 unlock() 方法.最后 unlock() 被调用了,lock

java锁的种类以及辨析(转载)

java锁的种类以及辨析(一):自旋锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及.本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑. 1.自旋锁 自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区.如下 01 public class SpinLock { 02  

java 锁!

问题:如何实现死锁. 关键: 1 两个线程ta.tb 2 两个对象a.b 3 ta拥有a的锁,同时在这个锁定的过程中,需要b的锁:tb拥有b的锁,同时在这个锁定的过程中,需要a的锁: 关键的实现难点是3, —— 所以说,死锁也不是那么容易出现的吧.. 实现方式synchronized.Lock 等等 死锁例子1  采用了不同类的两个对象. 原理是: 两个线程尝试进入同一个需要对象锁的方法 package basic.thread; public class DL { public static

Android多线程研究(9)——线程锁Lock

在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活和广泛的锁定对象操作,而且是以面向对象的方式进行对象加锁. @Override public void run() { while(true){ Lock lock = new ReentrantLock(); try { lock.lock(); Thread.sleep(new Random()

java锁和同步

Java 语言设计中的一大创新就是:第一个把跨平台线程模型和锁模型应用到语言中去,Java 语言包括了跨线程的关键字synchronized 和 volatile,使用关键字和java类库就能够简单的实现线程间的同步.在简化与平台无关的并发程序开发时,它没有使并发程序的编写工作变得繁琐,反而使它变得更容易了. 在这一章,我们详细介绍锁的技术和概念,java中提供了两种锁,一个是使用关键字的锁,还有一种类库提供的锁. synchronized关键字锁 synchronized关键字能够作为函数的修