`

线程同步方法二(synchronized)

 
阅读更多
package com.yli.thread.lock;

public class SynchronizedTest {

	public static final int TOTAL_AMOUNT = 100000;

	public static void main(String[] args) {
		Bank2 bank = new Bank2("yli", TOTAL_AMOUNT);
		Bank2 targetBank = new Bank2("ylz", 0);
		System.out.println(Thread.currentThread().getName() + "=========>总额="
				+ (bank.getBalance() + targetBank.getBalance()));
		for (int i = 0; i < 20000; i++) {
			TransferBank2 transfer = new TransferBank2(bank, targetBank, 5);
			Thread thread = new Thread(transfer);
			thread.setName("Transfer-" + i);
			thread.start();
		}
	}
}

class TransferBank2 implements Runnable {

	private Bank2 bank;
	private Bank2 targetBank;
	private int amount;

	public TransferBank2(Bank2 bank, Bank2 targetBank, int amount) {
		this.bank = bank;
		this.targetBank = targetBank;
		this.amount = amount;
	}

	@Override
	public void run() {
		this.bank.transferAccount(targetBank, amount);
	}

}

class Bank2 {

	private String name;
	private int balance;

	public Bank2(String name, int balance) {
		this.name = name;
		this.balance = balance;
	}

	/**
	 * synchronized提供了隐式锁机制,与ReentrantLock的lock()+unlock()作用相同
	 * wait()+notifyAll()的机制与Condition.await() + Condition.singalAll()相同
	 * @param targetBank
	 * @param amount
	 */
	public synchronized void transferAccount(Bank2 targetBank, int amount) {
		try {
			while (this.balance < amount) {
				this.wait();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		this.balance -= amount;
		targetBank.balance += amount;
		int total = this.getBalance() + targetBank.getBalance();
		System.out.println(Thread.currentThread().getName() + "=========>总额="
				+ total);
		if (total != SynchronizedTest.TOTAL_AMOUNT) {
			Thread.currentThread().interrupt();
			try {
				throw new InterruptedException("================>转账错误,停止运行");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		this.notifyAll();

	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public synchronized int getBalance() {
		return balance;
	}

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

}

 

分享到:
评论

相关推荐

    java的线程同步机制synchronized关键字的理解_.docx

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    java 多线程同步方法的实例

    Java提供了多种机制来实现线程同步,主要包括synchronized关键字、wait()、notify()和notifyAll()方法以及ReentrantLock等。 1. **synchronized关键字**:这是Java中最基本的线程同步方式。它可以用于修饰方法或...

    NET多线程同步方法详解

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

    正确使用多线程同步锁@synchronized()1

    总结起来,`@synchronized`是一种便捷的多线程同步手段,通过递归互斥锁实现代码的原子性。在使用时应注意以下几点: 1. `@synchronized`是基于对象的,传入的对象不能为`nil`,否则无效。 2. 由于使用了递归锁,它...

    Java线程及同步(synchronized)样例代码

    `synchronized`是Java中用于实现线程同步的重要关键字之一。它可以修饰方法或代码块,保证同一时刻只有一个线程能够访问被修饰的部分,从而实现对共享资源的保护。当一个对象的实例方法或静态方法被`synchronized`...

    25.线程的同步机制-synchronized同步语句-使用同步代码块解决同步方法的弊端.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java中线程同步方法

    Java提供了多种机制来实现线程同步,包括synchronized关键字、wait/notify方法、atomic操作、Lock接口以及Volatile变量等。本文将深入探讨这些同步方法及其应用场景。 #### 同步问题的提出 线程同步问题源于多线程...

    Java多线程同步.pdf

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

    17.线程的同步机制-synchronized同步方法-synchronized方法锁定的是整个对象.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    线程同步面试题深入解析

    在Java中,线程同步主要通过`synchronized`关键字来实现,防止多个线程同时访问临界区,以避免出现不可预期的结果。 1. **synchronized修饰同步方法** 使用`synchronized`关键字修饰的方法称为同步方法。同步方法...

    14.线程的同步机制-synchronized同步方法-局部变量为线程安全.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    30.线程的同步机制-synchronized同步语句-静态同步synchronized方法与synchronized(class)代码块.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java多线程同步机制研究分析.pdf

    Java多线程同步机制有两种类型:synchronized方法和synchronized块。synchronized方法是将访问共享资源的方法标记为synchronized,然后该标记的方法来控制对类成员变量的访问。synchronized块是将程序的某段代码使用...

    20.线程的同步机制-synchronized同步方法-synchronized锁重入.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    简单实现多线程同步示例(模拟购票系统)

    为了实现线程同步,Java提供了多种机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)等。在这个示例中,我们可能会用到synchronized关键字来修饰购票的方法,这样...

    21.线程的同步机制-synchronized同步方法-锁自动释放.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java 线程同步 信号量控制同步

    关于线程同步,需要牢牢记住的第二点是 “共享”这两个字。只有共享资源的读写访问才需要同步。如果不是共享资源,那么就根本没有同步的必要。 关于线程同步,需要牢牢记住的第三点是,只有“变量”才需要同步访问...

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

    二、线程同步 线程同步是多线程编程中的重要概念,用于控制不同线程间的执行顺序和访问共享资源的方式,防止竞态条件和死锁的发生。常见的线程同步机制包括: 1. **互斥量(Mutex)**:一种简单的同步机制,一次只有...

    多线程同步和通讯完整示例

    synchronized关键字提供了基本的线程同步,而wait-notify机制和Lock接口则提供了更高级的线程通讯和控制手段。在实际开发中,根据具体需求选择合适的同步策略,可以提高程序的效率和正确性。通过学习和实践...

Global site tag (gtag.js) - Google Analytics