`

Thread(4)--多线程同步

 
阅读更多
代码例子:
package com.test;

/**
 * 多线程同步:取钱
 * 
 * @author
 * 
 */
public class FetchMoney
{
	public static void main(String[] args)
	{
		Bank bank = new Bank();
		
		Thread t1 = new MoneyThread(bank);//表示柜台取钱
		
		Thread t2 = new MoneyThread(bank);//表示取款机取钱
		
		t1.start();
		
		t2.start();
		
		
		
	}
}
/**
 * 账户信息
 * @author yale
 *
 */
class Bank
{
	private int money = 1000;// 存款

	// 取钱操作
	public int getMoney(int number)
	{
		if (number < 0)// 取钱为负数
		{
			return -1;
		}
		else if (number > money)
		{
			return -2;
		}else if(money < 0)
                {
                        return -3;
                }
		else
		{
			try
			{
				//取钱的准备工作
				Thread.sleep(1000);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			money -= number;
			
			return number;
		}
	}
}
//操作账户的线程
class MoneyThread extends Thread
{
	private Bank bank;
	
	public MoneyThread(Bank bank)
	{
		this.bank = bank;
	}

	@Override
	public void run()
	{
		System.out.println(bank.getMoney(800));
	}
	
}


会输出:
800
800

出现这种情况的原因:首先2个线程构造同一个账户对象,当执行的getMoney的else时,假如第一个线程进来了,开始睡眠,还没有醒来的时候,第二个线程进来了,也开始睡眠,之后第一个线程醒来了,减掉800,剩下200,之后第二个线程醒来,在减掉800,账户变成-600了
处理办法:修改账户的getMoney()方法,添加synchronized(同步)
/**
 * 账户信息
 * @author yale
 *
 */
class Bank
{
	private int money = 1000;// 存款

	// 取钱操作
	public synchronized int getMoney(int number)
	{
		if (number < 0)// 取钱为负数
		{
			return -1;
		}
		else if (number > money)
		{
			return -2;
		}else if(money < 0)
                {
                        return -3;
                }
		else
		{
			try
			{
				//取钱的准备工作
				Thread.sleep(1000);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			money -= number;
			
			return number;
		}
	}
}


输出:
800
-2

为对象加锁,直到释放或者抛出异常才解锁,其他线程才有可能访问该对象的synchronized 的方法。
分享到:
评论

相关推荐

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

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

    thread.zip--狂神多线程+juc

    《狂神多线程+juc》是一份针对Java并发编程深度学习的资源包,主要涵盖了Java多线程基础以及Java并发工具集(JUC)的高级应用。在Java编程中,多线程是提高程序效率、实现并发执行的重要手段,而JUC(Java ...

    多线程实例源码11.rar--win32线程同步5大方案例程

    《多线程实例源码11.rar--win32线程同步5大方案例程》是一个专注于Windows操作系统下的多线程编程的资源包,其中包含了五个不同的线程同步方案的实例代码。线程同步是多线程编程中的关键概念,确保了在并发执行的...

    VB.Net-C#多线程Thread-代理委托delegate编程

    c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问.txt C#多线程使用TextBox控件 .txt C#多线程注意点.txt Control的...

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

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

    21-多线程和线程同步1

    "多线程和线程同步" 多线程编程是一种重要的编程技术,允许程序同时执行多个任务,从而提高程序的执行效率和响应速度。在 Java 中,多线程编程可以通过继承 Thread 类或实现 Runnable 接口来实现。 多线程的优点 ...

    python教程-05-多线程的使用.ev4.rar

    在Python中,有两个主要的模块用于实现多线程:`threading`和`_thread`。`threading`模块是更高级、功能更丰富的选项,通常在实际开发中被广泛使用。 1. **线程对象与创建**: - 使用`threading.Thread()`创建一个...

    商业编程-源码-多线程管理器源代码 thread manager.zip

    "商业编程-源码-多线程管理器源代码 thread manager.zip" 文件提供了一个具体的实现示例,帮助开发者深入理解多线程管理的原理和实践。 多线程技术是现代计算机软件中的一个核心概念,特别是在处理大量并发操作的...

    C#内存释放-线程控制-线程启动-线程暂停

    在C#编程中,线程控制和内存管理是两个至关重要的概念,特别是在处理并发和优化应用程序性能时。...在实践中,应始终注意线程同步和内存管理的最佳实践,以避免可能出现的问题,如死锁、竞态条件和内存泄漏。

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

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

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    Java多线程编程中,线程安全问题是常见的挑战,特别是在并发环境下,多个线程可能会同时访问和修改同一份共享资源,导致数据不一致。为了解决这个问题,Java提供了同步机制,其中一种常用的方式就是同步代码块...

    Java多线程-同步机制解决线程安全问题方式二:同步方法

    在Java多线程编程中,线程安全问题通常是指多个线程访问共享资源时可能出现的不一致或错误状态。...但是,过度使用同步可能会导致性能下降,因此在设计多线程程序时,需要根据具体需求和性能考虑来选择合适的同步策略。

    C#综合揭秘--细说多线程

    三、以ThreadStart方式实现多线程 通过传递ThreadStart委托,我们可以指定线程应执行的方法。例如: ```csharp Thread thread = new Thread(new ThreadStart(MyMethod)); thread.Start(); ``` 这里,MyMethod就是...

    北大Java--多线程

    5. **多线程的互斥与同步**: - 互斥是指在同一时刻,只有一个线程能访问共享资源,如`synchronized`关键字用于实现互斥。 - 同步是为了确保线程间正确地共享数据,避免数据竞争,Java提供了`synchronized`, `wait...

    java基础--11.多线程

    - **线程同步**:为了防止多个线程对共享资源的并发访问导致数据不一致,Java提供了synchronized关键字进行线程同步,包括同步方法和同步代码块。 - **线程通信**:wait(), notify()和notifyAll()方法用于线程间的...

    多线程+委托+进度条+线程安全------多线程给进度条赋值,考虑到线程安全

    在Windows环境下,Win32 API提供了CreateThread函数来创建新的线程,而.NET框架则提供了System.Threading命名空间,其中包括Thread类,使得多线程编程更为便捷。多线程可以充分利用多核处理器的性能,同时执行多个...

    【IT十八掌徐培成】Java基础第08天-03.多线程-同步代码块-同步方法.zip

    本教程将深入讲解Java中的多线程以及同步控制机制,特别是同步代码块和同步方法。 首先,我们要理解什么是线程。线程是程序执行的最小单位,一个进程中可以有多个线程并发执行。在Java中,可以通过实现`Runnable`...

    C++多线程一步步编程C++多线程一步步编程---多线程

    首先,我们需要了解C++11及后续标准中引入的 `&lt;thread&gt;` 头文件,这是实现多线程的基础。`std::thread` 类是核心,它允许我们创建和管理线程。例如,你可以通过以下方式创建一个新的线程: ```cpp #include #...

    java课件-5-多线程

    Java提供了丰富的并发工具,如synchronized关键字用于线程同步,防止数据竞争;wait()、notify()和notifyAll()方法用于线程间的协作;还有Semaphore、CyclicBarrier、CountDownLatch等高级并发工具,用于控制并发...

Global site tag (gtag.js) - Google Analytics