`

如何使用多个线程访问同一个资源

 
阅读更多

问题:如何起4个线程同时卖50张票?

 

第一个例子:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程各自分别卖了50张票(总共卖了200张票,这不是我们希望的结果)
 * 
 * 
 * @author guweiqiang
 */
public class ThreadDemo1 extends Thread {

	private int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start(); 
	}
}

 没有达到目的,改进:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程各自分别卖了50张票(总共卖了200张票,这不是我们希望的结果)
 * 但是如果加上static,则可以实现我们的目的
 * 
 * @author guweiqiang
 */
public class ThreadDemo1 extends Thread {

	private static int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start();   
		new ThreadDemo1().start(); 
	}
}

 达到了目的。

 

 

第二个例子:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程共同卖完50张票
 * 
 * @author guweiqiang
 */
public class ThreadDemo2 extends Thread {

	private int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		ThreadDemo2 t = new ThreadDemo2();
		new Thread(t, "1号窗口").start();   
		new Thread(t, "2号窗口").start();   
		new Thread(t, "3号窗口").start();   
		new Thread(t, "4号窗口").start(); 
	}
}

 

 

第三个例子:

package com.suning.test.thread;

/**
 * 多个线程同时使用同一个资源
 * 本例中,4个线程共同卖完50张票
 * 
 * @author guweiqiang
 */
public class ThreadDemo3 implements Runnable {

	private int ticket = 50;

	public void run() {
		while (true) {
			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName() + "is saling ticket" + ticket--);
			} else {
				break;
			}
		}
	}

	public static void main(String[] args) {
		ThreadDemo3 t = new ThreadDemo3();
		new Thread(t, "1号窗口").start();   
		new Thread(t, "2号窗口").start();   
		new Thread(t, "3号窗口").start();   
		new Thread(t, "4号窗口").start(); 
	}
}

 

 

 

分享到:
评论

相关推荐

    Qt 多线程访问同一个变量

    通过正确地使用互斥锁,我们可以确保全局变量在同一时间只被一个线程访问,避免竞态条件和数据不一致性。在实际项目中,根据具体需求,可能还需要结合其他同步原语,如信号和槽、条件变量等,来实现更复杂的线程同步...

    C#多线程互斥实例 多线程获取同一变量

    2. **共享资源**:在多线程环境中,多个线程可能需要访问同一个数据或对象,这就形成了共享资源。 3. **竞态条件**:当两个或多个线程同时访问并修改共享资源时,如果没有适当的同步措施,可能导致数据的不一致性,...

    易语言多线程访问网页

    1. **线程基础**:线程是操作系统调度的基本单位,一个进程可以包含多个线程。在易语言中,通过创建和管理线程,可以并发地执行多个任务。创建线程的方法是调用“创建线程”命令,每个线程都有自己的执行上下文,...

    多线程同步(多线程如何访问临界区资源)

    首先,定义一个全局或静态变量作为共享资源,然后创建多个线程。每个线程在执行时都会尝试访问这个资源,但在进入临界区之前,线程会先尝试获取临界区的控制权。如果控制权已被其他线程持有,那么该线程将被挂起,...

    python 多线程实现多个网址的多次快速访问

    当运行这个程序时,它会创建多个线程,每个线程都会对指定的URL进行多次访问。由于网络请求可能有延迟,所以多线程可以同时进行,从而加快总体的访问速度。然而,需要注意的是,过多的并发请求可能会导致服务器压力...

    易语言多线程访问网页源码,多线程访问网页,子程序_访问网页(1).zip

    2. **同步与互斥**:当多个线程访问同一资源时,需要防止数据竞争。易语言可能会提供类似`Mutex`或`Semaphore`的同步原语来保证线程安全。 3. **回调函数**:在线程完成任务后,可能会调用一个回调函数来处理结果或...

    线程同步机制解决多线程资源访问冲突

    在“AccessConflictEvent”这个示例中,我们可以想象一个场景:多个线程试图同时访问一个数据库连接或其他公共资源。通过创建一个事件对象,我们可以在访问资源前让线程等待,直到事件被触发,表示资源已经准备就绪...

    VC++多线程同步基本示例

    在编程领域,尤其是在Windows平台下开发C++应用时,多线程技术是非常关键的一部分,它允许程序同时执行多个任务,从而提升系统效率。本示例着重讲解了VC++中的多线程同步,这是多线程编程中确保数据安全和正确性的...

    多线程访问网页

    1. **竞态条件**:当多个线程访问同一资源时,可能会出现数据不一致的情况,这需要通过锁或其他同步机制来避免。 2. **死锁**:多个线程相互等待对方释放资源,导致所有线程都无法继续执行,需要谨慎设计线程间的...

    COM多线程访问演示

    在MTA中,线程安全需要程序员自己来保证,因为多个线程可能会同时调用同一个对象。 线程同步是多线程编程中的关键概念,它确保在特定时间只有一个线程可以访问共享资源,防止数据竞争和死锁。在COM中,可以使用各种...

    C#多线程执行

    创建一个新的线程可以使用Thread类的构造函数,传入一个委托作为线程启动时要执行的方法。例如: ```csharp Thread thread = new Thread(new ThreadStart(YourMethod)); thread.Start(); ``` 在这里,`YourMethod`...

    创建多线程线程同步

    线程同步是为了避免多个线程访问同一资源时产生的竞态条件,确保数据的一致性和正确性。常见的线程同步机制包括: 1. **互斥量(Mutex)**:互斥量提供独占访问,一次只有一个线程可以持有互斥量,其他试图获取的...

    多线程资源共享集合

    然而,当多个线程访问和修改同一资源时,可能会引发数据不一致、竞态条件等问题,这就需要我们进行资源共享的管理。 `synchronized`关键字是Java中用来控制多线程并发访问共享资源的一种机制。它提供了互斥访问,...

    MFC中的多线程同步

    它表示一个事件对象,可以用来通知一个或多个线程开始执行某个任务或资源已准备好。CEvent有两种状态:有信号和无信号,线程可以等待事件变为有信号状态才能继续执行。 在"MfcMutexes"这个例子中,我们可以期待看到...

    多线程访问网页测试

    这是因为多个线程可能同时尝试更新同一个变量(搜索结果计数),这可能导致数据竞争和不一致。通过锁定,可以确保一次只有一个线程能访问和修改共享资源。 此外,为了防止过多的并发请求导致服务器压力过大,可能会...

    linux中一个程序的两个线程的同步(c语言实现)

    当一个线程访问资源时,需要执行 P 操作(wait 操作),将信号灯的值减 1;当线程释放资源时,需要执行 V 操作(signal 操作),将信号灯的值加 1。 信号灯的实现 在 Linux 操作系统中,可以使用 sys/sem.h 头文件...

    C#多线程C#线程及访问杂记

    - **Monitor类**:Monitor类提供了Enter、Exit方法来实现线程的互斥访问,确保同一时间只有一个线程可以访问特定资源。 - **Mutex**:Mutex是全局互斥锁,可以跨进程使用,确保只有一个进程或线程能访问共享资源。...

    多线程数据同步

    在多线程编程中,数据同步是一个至关重要的概念,它涉及到如何确保多个线程在并发访问共享资源时能正确地协调工作,避免数据竞争和不一致的状态。标题"多线程数据同步"直指这一核心问题,而描述则具体提到了使用临界...

    MFC多线程同步类的使用

    - `CSemaphore`:允许多个线程同时访问资源,限制并发数量,常用于限制并发访问的视图窗口等。 - `CMutex`:跨进程同步,确保同一时间只有一个应用程序可以访问资源,如DLL中的资源。 - `CEvent`:等待特定事件的...

    多线程的互斥访问临界资源

    在多线程编程中,临界资源是指同一时间只能被一个线程访问的共享资源,例如内存中的某个变量、数据库连接或硬件设备等。当多个线程试图同时访问临界资源时,可能会导致数据不一致或者竞态条件,从而引发错误。为了...

Global site tag (gtag.js) - Google Analytics