`

线程同步--同步锁

阅读更多
       从JDK1.5之后,Java提供了另外一种线程同步机制:它通过显示定义同步锁对象来实现线程同步,在这种机制下,同步锁应该使用Lock对象充当。
        Lock提供了比synchronized方法和synchroized代码块更广泛的锁定操作,Lock实现允许更灵活的结构,可以具有差别很大的属性,并且可以支持多个相关的Condition对象。
        Lock是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应该先获得Lock对象。不过某些锁可能允许对共享资源的并发访问,如ReadWriteLock(读写锁)。当然,在线程安全的控制中,通常喜欢使用ReentrantLock(可重入锁)。使用Lock对象可以显示地加锁,释放锁。
        以下通过模拟银行取款程序实现过程来理解同步锁的运用,模拟取款过程可建立以下类:【1】用户类【2】取款类【3】测试类。

       【1】用户类Account 代码如下:
        package com.thread.lock;

import java.util.concurrent.locks.*;

/**
*用户
*
* @author wwb
*/

public class Account {

/**
* 定义锁对象
*/
private final ReentrantLock lock = new ReentrantLock();
/**
* 账户
*/
private String accountNo;
/**
* 账户余额
*/
private double balance;

public Account() {
}

public Account(String accountNo, double balance) {
this.accountNo = accountNo;
this.balance = balance;
}

public void draw(double drawAmount) {
lock.lock();
try {
// 账户余额大于取钱数目
if (balance >= drawAmount) {
// 吐出钞票
System.out.println(Thread.currentThread().getName()
+ "取钱成功!吐出钞票:" + drawAmount);
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
// 修改余额
balance -= drawAmount;
System.out.println("\t余额为: " + balance);
} else {
System.out.println(Thread.currentThread().getName()
+ "取钱失败!余额不足!");
}
} finally {
lock.unlock();
}
}

public int hashCode() {
return accountNo.hashCode();
}

public boolean equals(Object obj) {
if (obj != null && obj.getClass() == Account.class) {
Account target = (Account) obj;
return target.getAccountNo().equals(accountNo);
}
return false;
}

public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}

public String getAccountNo() {
return this.accountNo;
}

public double getBalance() {
return this.balance;
}
}

    
      【2】取款类DrawThread代码如下:

package com.thread.lock;

/**
* 取款类
*
* @author wwb
*/

public class DrawThread extends Thread {
// 模拟用户账户
private Account account;
// 当前取钱线程所希望取的钱数
private double drawAmount;

/**
* 有參構造方法
*
* @param name
*            线程名
* @param account
*            用户账户
* @param drawAmount
*            取钱数
*/
public DrawThread(String name, Account account, double drawAmount) {
super(name);
this.account = account;
this.drawAmount = drawAmount;
}

// 当多条线程修改同一个共享数据时,将涉及到数据安全问题。
public void run() {
account.draw(drawAmount);
}
}

      
       【3】测试类TestDraw代码如下:
package com.thread.lock;
/**
* 测试类
*
* @author wwb
*/
public class TestDraw {
public static void main(String[] args) {
// 创建一个账户
Account acct = new Account("1234567", 1000);
// 模拟两个线程对同一个账户取钱
new DrawThread("甲", acct, 800).start();
new DrawThread("乙", acct, 800).start();
}
}
[/align][align=center]
分享到:
评论

相关推荐

    vc++中的线程锁(线程锁保持线程同步)

    本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过线程锁来保持线程同步。 线程同步是多线程编程中的一个核心问题,它涉及到多个线程之间协调执行的机制,以防止在共享数据上的冲突。当多个线程试图同时修改同...

    线程同步--生产者消费者问题

    在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...

    线程同步-mutex方案-Peterson方案

    在操作系统中,线程同步是确保多个并发执行的线程在访问共享资源时能正确协调其操作的关键技术。本文将详细探讨线程同步中的两种经典解决方案:mutex方案和Peterson方案,以及它们在Java环境中的实现。 首先,我们...

    L16-多线程和线程同步-讲义.pdf

    Java中的多线程和线程同步是编程中关键的概念,特别是在处理并发操作和优化性能时。下面我们将深入探讨这些主题。 首先,线程是程序执行的独立路径,它允许一个程序同时执行多个任务。在Java中,我们有两种方式创建...

    动力节点_Java基础视频教程220_线程-线程同步-使用同步锁的卖票

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    JAVA线程高级-线程按序交替执行

    - 同步锁机制通过监视器锁(Monitor)实现,每个对象都有一个内置锁,即监视器。 3. **Java并发工具包JUC**: - JUC包含了许多高级并发组件,如`Semaphore`信号量、`CyclicBarrier`回环栅栏、`CountDownLatch`倒...

    线程同步方法--Metux 实例

    Metux是一个开源的多线程库,它提供了丰富的线程同步原语,如互斥锁(Mutex)、信号量(Semaphore)和条件变量(Condition Variable)等,这些都是实现线程间协同工作的重要工具。在“TestMutex”这个例子中,我们将...

    进程与线程--小练习

    在"进程与线程--小练习"这个主题中,可能包含了一些实践性的例子,比如创建和管理进程、线程的示例,或者展示了如何使用操作系统提供的API来实现进程间通信和线程同步。这些练习可以帮助学习者更好地理解和掌握进程...

    线程-线程池-锁-集合-Map-队列.docx

    NEW表示线程刚创建还未启动,RUNNABLE表示线程在执行或等待CPU资源,BLOCKED表示线程被阻塞等待监视器锁,WAITING表示线程处于无限制等待状态,TIMED_WAITING是有限等待状态,而TERMINATED表示线程已经执行完毕。...

    Java多线程编程总结

    Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的...

    C#线程同步的几种方法

    对于整数类型的操作,`System.Threading.Interlocked`类提供了一种轻量级的线程同步解决方案,其中包含的方法如`Increment`, `Decrement`, `Exchange`和`CompareExchange`,能够在不使用锁的情况下实现线程安全的...

    11-线程同步

    综上所述,线程同步是多线程编程的核心,通过互斥量、条件变量、信号量、死锁避免策略以及文件锁等工具,我们可以有效地管理和协调并发线程,确保程序的正确性和高效性。理解并熟练应用这些概念,对于开发稳定、高效...

    linux之线程同步一-.zip

    在Linux操作系统中,线程同步是多线程编程中的一个重要概念,它确保了多个线程在访问共享资源时能够有序、正确地执行,避免数据不一致性和竞态条件等问题。本资料包“linux之线程同步一”主要探讨了Linux环境下的...

    day06 线程、同步-每日作业卷-答案1

    【Java线程与同步基础】 线程是程序中的执行流,是操作系统...以上就是关于Java中创建线程、线程同步以及线程标识的基础知识,这些概念是Java多线程编程的核心,理解和掌握它们对于开发高效、安全的并发程序至关重要。

    C#多线程探索---讲诉多线程

    #### 线程同步与死锁预防 在多线程环境中,同步机制至关重要,旨在防止多个线程同时修改同一共享资源导致的数据不一致问题。C#提供了多种同步机制,如互斥锁(`Mutex`)、读写锁(`ReaderWriterLock`)、信号量(`...

    线程同步的五种方法

    线程同步是多线程编程中的重要概念,用于协调多个并发执行的线程,确保它们在访问共享资源时不会产生竞态条件或数据不一致性。在Windows编程中,提供了多种线程同步机制,包括互斥量、临界区、原子操作、事件以及...

    Java多线程同步.pdf

    "Java多线程同步.pdf" Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用...

    多线程的批量线程同步解决方案

    "多线程的批量线程同步解决方案"这个标题暗示我们探讨的是如何在多线程环境下有效地管理和同步多个任务,确保数据一致性与程序正确性。下面将详细阐述相关知识点。 一、多线程基础 多线程是指在一个进程中同时执行...

Global site tag (gtag.js) - Google Analytics