`

确保多线程操作的是同一个共享资源

    博客分类:
  • Java
 
阅读更多

 

共享资源定义为成员变量

run()定义在内部类中,这样,内部类中的线程就可以直接访问同一份资源了

 

package thread;
/**
 * 多线程共享资源的方式一:
 * 
 * 操作共享资源的run()放到内部类中,然后操作外部类中定义的资源
 * 
 * 1个线程负责加,1个线程负责减
 */
public class ShareDataStyle1 {
	
	private int sharedData = 100;
	
	public synchronized void add() {
		sharedData++;
		System.out.println(Thread.currentThread().getName()+" add:" + sharedData);
	}
	
	public synchronized void minus() {
		sharedData--;
		System.out.println(Thread.currentThread().getName()+" minus:" + sharedData);
	}
	
	//内部类访问外部类的共享资源
	class Add implements Runnable {
		public void run() {
			while(true) 
				add();
		}
	}
	
	//内部类访问外部类的共享资源
	class Minus implements Runnable {
		public void run() {
			while(true) 
				minus();
		}
	}
	
	public static void main(String[] args) {
		ShareDataStyle1 sharedDate = new ShareDataStyle1();
		new Thread(sharedDate.new Add()).start();
		new Thread(sharedDate.new Minus()).start();
	}
	
}

 

共享资源在外部单独定义

然后,通过Runnable子类构造方法传入同一个资源即可

 

package thread;


/**
 * 多线程共享资源的方式二:
 * 
 * 将共享资源传递到不同的Runnable对象中
 * 
 * 1个线程负责加,1个线程负责减
 */
public class ShareDataStyle2 {
	
	public static void main(String[] args) {
		SharedData data = new SharedData();
		new Thread(new Add(data)).start();
		new Thread(new Minus(data)).start();
	}
	
}


class SharedData {
	private int sharedData = 100;
	
	public synchronized void add() {
		sharedData++;
		System.out.println(Thread.currentThread().getName()+" add:" + sharedData);
	}
	
	public synchronized void minus() {
		sharedData--;
		System.out.println(Thread.currentThread().getName()+" minus:" + sharedData);
	}
}

class Add implements Runnable {
	SharedData sharedData;
	public Add(SharedData sharedData) {
		this.sharedData = sharedData;
	}
	
	public void run() {
		while(true) 
			sharedData.add();
	}
}

class Minus implements Runnable {
	SharedData sharedData;
	public Minus(SharedData sharedData) {
		this.sharedData = sharedData;
	}
	
	public void run() {
		while(true) 
			sharedData.minus();
	}
}

 

分享到:
评论

相关推荐

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

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

    Qt 多线程访问同一个变量

    标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁来解决这个问题,并通过创建两个线程ThreadA和ThreadB来演示这一过程。 首先...

    QT中sqlite多线程操作4个注意问题

    在Qt框架中,SQLite...总之,Qt中SQLite的多线程操作需要谨慎处理,遵循良好的并发编程实践,以确保数据一致性、安全性和应用程序的稳定性。正确理解和应用上述原则将有助于避免潜在的问题,提升多线程应用的性能。

    多线程操作共享文件.zip

    本压缩包“多线程操作共享文件.zip”显然是一个关于如何在Delphi中实现多线程间互斥访问共享文件的示例项目。 标题“多线程操作共享文件.zip”直接揭示了主题,即通过多线程技术处理同一份文件,这在分布式系统、...

    易语言多线程操作

    在易语言中进行多线程操作,主要涉及以下几个知识点: 1. **线程创建**:在易语言中,可以通过`创建线程`命令创建新的线程。这个命令需要指定一个线程入口子程序,也就是新线程开始执行的代码段。创建线程时,可以...

    C#实现多线程同步并发操作

    1. **线程同步**:指的是控制多个线程对共享资源的访问,避免竞态条件(race condition),确保数据的一致性和完整性。 2. **临界区**:指代码中访问和修改共享资源的部分,必须确保一次只有一个线程能够进入临界...

    VB多线程操作

    在VB(Visual Basic)编程环境中,多线程操作是一个关键的概念,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在标题"VB多线程操作"中,我们聚焦的是如何在VB中实现和管理多线程。 多线程在...

    多线程临界段同步演示1

    与临界区相比,互斥量(Mutex)可以在进程间同步,也就是说,不同进程中的线程也可以使用同一个互斥量来保护共享资源。而事件(Event)则更灵活,可以用于线程间的通信和同步,例如等待特定条件的发生。 在实际编程...

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

    总之,多线程同步是保证多线程环境下正确操作共享资源的关键。临界区作为一种简单有效的同步机制,被广泛应用于各种多线程编程场景。理解并掌握临界区的使用,对于编写高效、可靠的多线程程序至关重要。在实际项目中...

    操作系统实验多线程同步(含C++源代码)

    操作系统中的多线程同步是一个关键概念,特别是在并发编程中,它涉及到如何协调多个线程以避免数据不一致性和竞态条件。在这个实验中,我们关注的是C++编程语言中的实现,以及操作系统如何处理线程的优先级。 首先...

    用C#实现的多线程同步打印文章(windows操作系统实验)

    同步是多线程编程中的关键概念,它确保在特定时刻只有一个线程可以访问共享资源,以防止数据竞争和不一致。在我们的实验中,缓冲区就是共享资源,需要进行同步控制。C#提供了多种同步机制,如锁(`lock`关键字)、...

    3种多线程实现同步方法

    在实际开发中,开发者应根据具体需求选择合适的同步策略,以确保多线程程序的正确性和性能。在设计多线程程序时,不仅要考虑同步问题,还要注意减少线程间的上下文切换,避免死锁和饥饿现象,确保程序的健壮性和可...

    创建多线程线程同步

    多线程是指在一个进程中可以同时运行多个独立的执行流,每个执行流被称为一个线程。线程共享同一进程的内存空间,包括全局变量、静态变量等,但拥有各自的栈空间,用于存储局部变量和函数调用信息。通过多线程,程序...

    多线程同时操作全局变量的出错演示

    同步是确保多线程之间正确协调执行的一种方法,确保对共享资源的访问是有序的。常见的同步原语有锁(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)等。在C++中,可以使用`std::mutex`来实现互斥锁...

    ThreadLocked多线程共享资源

    "ThreadLocked多线程共享资源"这个主题,就是探讨如何在C#中有效地管理和保护这些共享数据,以确保线程安全。 一、线程锁概念 线程锁是一种同步机制,用于限制对特定代码段的并发访问。在C#中,主要的线程锁包括`...

    多线程操作_paintawe_多线程写入例程_

    在IT行业中,多线程操作是一项重要的编程技术,特别是在处理大量数据或实现高效并发时。本文将详细讨论“Paintawe”项目中的多线程写入例程,这是一段用于教学和参考的代码实例。 首先,我们要理解多线程的概念。在...

    操作系统设计 多线程同步模拟(C++版)

    通过合理使用这些同步对象,开发者可以确保多线程程序的正确性和可靠性。 在"MultiThread"这个项目中,我们可以推测作者可能实现了一个模拟操作系统内核的多线程同步环境,可能包括创建线程、销毁线程、同步操作等...

Global site tag (gtag.js) - Google Analytics