`

线程同步--同步方法

阅读更多
         与同步代码块对应的,Java的多线程安全支持还提供了同步方法,同步方法就是使用synchronized关键字来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示的指定同步监视器,同步方法的同步监视器是this,也就是该对象本身。
           通过同步方法可以非常方便的将某类变成线程安全的类。为什么要用同步方法?我们知道对于不可变类总是线程安全的,因为它的对象的状态不可改变。但可变对象需要额外的方法来保证其线程安全。例如:在模拟银行取款的用户类就是一个可变类。它的账户余额(假设有这个属性)这个属性就是可变的,当两个线程同时修改用户账户这个类的账户余额属性时,程序就会出现异常。可以把用户账户的取钱方法设置为同步方法来保证线程安全。用同步方法模拟银行取款可建立以下类:【1】用户类【2】取款类【3】测试类。

                【1】用户类Account代码如下:

package com.thread.synchronizedMethod;

/**
* 用户类
*
* @author wwb
*
*/
public class Account {
private String accountNo;
private double balance;

public Account() {
}

public synchronized void draw(double drawAmount) {
// 账户余额大于取钱数目
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() + "取钱失败!余额不足!");
}
}

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

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

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

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

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;
}
}

                 【2】取款类DrawThread代码:

package com.thread.synchronizedMethod;

/**
* 取款类
*
* @author wwb
*
*/
public class DrawThread extends Thread
{
//模拟用户账户
private Account account;
//当前取钱线程所希望取的钱数
private double 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.synchronizedMethod;

/**
* 测试类
*
* @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();
    }
}

分享到:
评论

相关推荐

    vc++ multithread多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区

    本教程将深入探讨四种常见的线程同步机制:事件对象、信号量、互斥量以及临界区,帮助开发者理解和掌握如何在VC++中安全地实现多线程通信。 一、事件对象 事件对象是Windows API中用于线程间通信的一种同步机制。它...

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

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

    线程同步-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

    线程同步-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

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

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

    线程同步方法--Metux 实例

    总之,“线程同步方法--Metux实例”通过C++的`std::mutex`展示了如何在Metux库中实现线程安全的资源共享,这对于理解和应用多线程编程,特别是在网络编程中,具有很高的实践价值。通过深入学习和实践这个实例,...

    C#线程同步的几种方法

    因此,掌握有效的线程同步方法对于开发稳定可靠的多线程应用至关重要。 ### 1. volatile关键字 `volatile`关键字用于标记那些可能被不同线程访问和修改的变量,它强制所有读写操作直接从主内存进行,避免了缓存...

    多线程编程之四——线程的同步-VC知识库文章[归纳].pdf

    多线程编程之四——线程的同步-VC知识库文章[归纳].pdf

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

    然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程中被称为线程同步或线程协调。Java提供了一些高级特性来实现这样的需求,比如`Thread`类、`synchronized`关键字...

    3种多线程实现同步方法

    本篇文章将深入探讨三种在C++中实现多线程同步的方法:事件对象、关键代码段和互斥对象。 首先,我们来看**事件对象**。事件对象是一种信号机制,用于线程间通信和同步。在Windows API中,CreateEvent函数创建一个...

    线程同步的五种方法

    在实际编程中,根据应用场景选择合适的线程同步方法至关重要。例如,如果只需要保护一个资源的访问,临界区可能是最佳选择;如果需要控制同时访问资源的线程数量,可以使用信号量或事件;对于跨进程的同步,互斥量是...

    动力节点_Java基础视频教程219_线程-线程同步-没有同步的卖票

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

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

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

    使用三种VC的多线程同步方法编写一个多线程的程序

    1.使用三种VC的多线程同步方法编写一个多线程的程序(要求在屏幕上先显示Hello,再显示World)。 1)基于全局变量的多线程同步程序; 2)基于事件的多线程同步程序; 3)基于临界区的多线程同步程序。

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    用多线程同步方法解决生产者-消费者问题

    本项目要求用多线程同步方法解决生产者-消费者问题,其中存在多个生产者和消费者线程。缓冲池有n个缓冲区,生产者将产品放入缓冲区,消费者从中取走产品。为了防止消费者访问空缓冲区或生产者向已满的缓冲区添加...

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

    在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...

    NET多线程同步方法详解

    本文将深入探讨.NET框架中实现线程同步的多种方法。 首先,我们来看自由锁(InterLocked)。自由锁主要通过Interlocked类提供的静态方法来实现线程安全的整型数值操作,如Increment和Decrement。这些操作在多线程环境...

    java 多线程同步方法的实例

    本文将深入探讨Java中的多线程同步方法,并通过实例来阐述其工作原理。 首先,我们要理解线程同步的基本概念。在多线程环境中,当多个线程试图访问同一资源时,如果没有适当的同步控制,可能会导致不可预测的结果。...

    进程与线程--小练习

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

Global site tag (gtag.js) - Google Analytics