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 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...
Java提供了多种机制来实现线程同步,主要包括synchronized关键字、wait()、notify()和notifyAll()方法以及ReentrantLock等。 1. **synchronized关键字**:这是Java中最基本的线程同步方式。它可以用于修饰方法或...
本文将深入探讨.NET框架中实现线程同步的多种方法。 首先,我们来看自由锁(InterLocked)。自由锁主要通过Interlocked类提供的静态方法来实现线程安全的整型数值操作,如Increment和Decrement。这些操作在多线程环境...
总结起来,`@synchronized`是一种便捷的多线程同步手段,通过递归互斥锁实现代码的原子性。在使用时应注意以下几点: 1. `@synchronized`是基于对象的,传入的对象不能为`nil`,否则无效。 2. 由于使用了递归锁,它...
`synchronized`是Java中用于实现线程同步的重要关键字之一。它可以修饰方法或代码块,保证同一时刻只有一个线程能够访问被修饰的部分,从而实现对共享资源的保护。当一个对象的实例方法或静态方法被`synchronized`...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
Java提供了多种机制来实现线程同步,包括synchronized关键字、wait/notify方法、atomic操作、Lock接口以及Volatile变量等。本文将深入探讨这些同步方法及其应用场景。 #### 同步问题的提出 线程同步问题源于多线程...
Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用synchronized关键字还不能...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在Java中,线程同步主要通过`synchronized`关键字来实现,防止多个线程同时访问临界区,以避免出现不可预期的结果。 1. **synchronized修饰同步方法** 使用`synchronized`关键字修饰的方法称为同步方法。同步方法...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
Java多线程同步机制有两种类型:synchronized方法和synchronized块。synchronized方法是将访问共享资源的方法标记为synchronized,然后该标记的方法来控制对类成员变量的访问。synchronized块是将程序的某段代码使用...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
为了实现线程同步,Java提供了多种机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)等。在这个示例中,我们可能会用到synchronized关键字来修饰购票的方法,这样...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
关于线程同步,需要牢牢记住的第二点是 “共享”这两个字。只有共享资源的读写访问才需要同步。如果不是共享资源,那么就根本没有同步的必要。 关于线程同步,需要牢牢记住的第三点是,只有“变量”才需要同步访问...
二、线程同步 线程同步是多线程编程中的重要概念,用于控制不同线程间的执行顺序和访问共享资源的方式,防止竞态条件和死锁的发生。常见的线程同步机制包括: 1. **互斥量(Mutex)**:一种简单的同步机制,一次只有...
synchronized关键字提供了基本的线程同步,而wait-notify机制和Lock接口则提供了更高级的线程通讯和控制手段。在实际开发中,根据具体需求选择合适的同步策略,可以提高程序的效率和正确性。通过学习和实践...