`

Java锁

 
阅读更多
说明:Java多线程相关相关几篇文章转自http://lavasoft.blog.51cto.com/62575/27069/。为以后查阅方便,转载到此处。
    在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks 包下面,里面有三个重要的接口Condition、Lock、ReadWriteLock。
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。
Lock实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。
ReadWriteLock维护了一对相关的锁定,一个用于只读操作,另一个用于写入操作。


示例代码
package com.ajita;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class TestLock {
	public static void main(String[] args) {
		// 创建并发访问的账户
		MyCount myCount = new MyCount("95599200901215522", 10000);
		// 创建一个锁对象
		ReadWriteLock lock = new ReentrantReadWriteLock(false);
		// 创建一个线程池
		ExecutorService pool = Executors.newFixedThreadPool(2);
		// 创建一些并发访问用户,一个信用卡,存的存,取的取,好热闹啊
		User u1 = new User("张三", myCount, -4000, lock, false);
		User u2 = new User("张三他爹", myCount, 6000, lock, false);
		User u3 = new User("张三他弟", myCount, -8000, lock, false);
		User u4 = new User("张三", myCount, 800, lock, false);
		User u5 = new User("张三他爹", myCount, 0, lock, true);
		// 在线程池中执行各个用户的操作
		pool.execute(u1);
		pool.execute(u2);
		pool.execute(u3);
		pool.execute(u4);
		pool.execute(u5);
		// 关闭线程池
		pool.shutdown();
	}
}

/**
 * 信用卡的用户
 */
class User implements Runnable {
	private String name; // 用户名
	private MyCount myCount; // 所要操作的账户
	private int iocash; // 操作的金额,当然有正负之分了
	private ReadWriteLock myLock; // 执行操作所需的锁对象
	private boolean ischeck; // 是否查询

	User(String name, MyCount myCount, int iocash, ReadWriteLock myLock,
			boolean ischeck) {
		this.name = name;
		this.myCount = myCount;
		this.iocash = iocash;
		this.myLock = myLock;
		this.ischeck = ischeck;
	}

	public void run() {
		if (ischeck) {
			// 获取读锁
			myLock.readLock().lock();
			System.out.println("读:" + name + "正在查询" + myCount + "账户,当前金额为"
					+ myCount.getCash());
			// 释放读锁
			myLock.readLock().unlock();
		} else {
			// 获取写锁
			myLock.writeLock().lock();
			// 执行现金业务
			System.out.println("写:" + name + "正在操作" + myCount + "账户,金额为"
					+ iocash + ",当前金额为" + myCount.getCash());
			myCount.setCash(myCount.getCash() + iocash);
			System.out.println("写:" + name + "操作" + myCount + "账户成功,金额为"
					+ iocash + ",当前金额为" + myCount.getCash());
			// 释放写锁
			myLock.writeLock().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='" + oid + '\'' + ", cash=" + cash + '}';
	}
}
分享到:
评论

相关推荐

    java锁详解.pdf

    Java 锁详解 Java 锁是 Java 并发编程中的一种基本机制,用于确保线程安全和避免竞争条件。Java 锁可以分为两大类:synchronized 锁和 ReentrantLock 锁。 一、Synchronized 锁 1. 锁的原理:synchronized 锁是...

    java锁的释放与建立

    本篇文章将深入探讨Java锁的释放与建立,以及它们之间的_happens-before_关系,旨在帮助开发者更好地理解和应用并发控制。 首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`...

    Java锁机制详解.pdf

    Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...

    Java锁的种类以及区别

    ### Java锁的种类及其区别 在Java编程语言中,锁是一种重要的同步机制,用于控制多个线程对共享资源的访问,防止数据不一致等问题的发生。本文将详细介绍Java中几种常见的锁类型及其之间的区别。 #### 一、公平锁...

    java锁机制详解.pdf

    Java锁机制是多线程编程中的关键概念,用于控制对共享资源的并发访问。在Java中,主要的锁机制包括`synchronized`关键字和`Lock`接口(如`ReentrantLock`)。下面将详细讲解这两种锁机制及其应用。 1. `...

    面向Java锁机制的字节码自动重构框架.zip

    Java锁机制是多线程编程中的关键组成部分,用于控制对共享资源的访问,确保并发环境下的数据一致性。本文将深入探讨Java锁机制,并基于提供的"面向Java锁机制的字节码自动重构框架"来讨论其背后的原理和应用。 在...

    java锁机制Synchronizedjava锁机制Synchronized

    "Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...

    彻底理解Java中的各种锁.pdf

    通过以上对Java锁机制的详细介绍,可以看出Java在并发控制方面具有丰富的工具和策略,它们能够帮助开发者在多线程编程中处理好资源竞争和线程协作的问题,从而编写出高效且线程安全的应用程序。

    java-syn.zip_Java syn_Java syn锁_java同步锁syn_java锁 syn_syn同步事务锁

    4. **Java锁的类型**: - **内置锁**:也称为监视器锁,由`synchronized`关键字提供。 - **显式锁**:如`java.util.concurrent.locks.Lock`接口及其实现,如`ReentrantLock`,提供了更复杂的锁操作,如可中断锁...

    JAVA锁的膨胀过程-分析-适合Java新手道架构师

    JAVA 锁的膨胀过程 JAVA 锁的膨胀过程是一个重要的知识点,用于理解 JAVA 中的锁机制。锁机制是 JAVA 中的一种同步机制,用于解决多线程访问共享资源的问题。在 JAVA 中,锁机制分为四个状态:无锁状态、偏向锁状态...

    java锁各种核心整理

    Java锁机制是多线程编程中非常重要的概念,它确保了数据的一致性和线程之间的同步。在Java中,锁的机制主要可以分为乐观锁和悲观锁两大类,此外还包括自旋锁、Synchronized同步锁和可重入锁等,下面将详细介绍这些...

    Java锁的知识总结及实例代码共7页.pdf.zip

    本资料"Java锁的知识总结及实例代码共7页.pdf.zip"详细介绍了Java锁的原理、类型以及实际应用,旨在帮助开发者深入理解并熟练运用Java锁机制。 在Java中,锁主要分为两类:内置锁(也称为监视器锁)和显式锁。内置...

    MySQL与Java锁的学习

    本主题聚焦于“MySQL与Java锁的学习”,这是一门深入理解如何在数据库层(MySQL)和应用层(Java)处理并发问题的关键技能。下面我们将详细探讨MySQL中的锁机制以及Java如何与之协同工作。 **MySQL中的锁** MySQL...

    Java的锁机制的学习和使用

    #### 一、Java锁机制概览 Java中的锁机制主要用于解决多线程环境下的资源竞争问题。在并发编程中,为了保证数据一致性与正确性,通常需要采用各种锁来控制对共享资源的访问。Java语言提供了多种锁机制,包括`...

    Java锁.xmind

    【图解版】Java锁精确分类,从JAVA各类锁进行分析和分类,精确分类Java各种锁,不可用于商业用途,如有版权问题,请联系删除!

    1java锁与并发与线程池.doc

    1. **Java锁与线程交互** - `Thread.join()`方法允许一个线程等待另一个线程完成。在示例中,主线程启动线程a,然后等待a结束,接着启动线程b并等待其结束,最后主线程结束。 - **守护线程**(Daemon Threads)与...

    JAVA锁的膨胀过程和优化.docx

    本文将详细介绍Java锁的膨胀过程和优化策略。 首先,我们来看自旋锁。自旋锁是一种优化策略,当一个线程尝试获取已被其他线程持有的锁时,它并不会立即阻塞,而是会进行一次忙循环,持续检查锁是否已释放。如果持有...

Global site tag (gtag.js) - Google Analytics