`

多个线程之间共享数据的方式探讨

阅读更多
/**
 * MultiThreadShareData.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-17    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
 */

package cn.com.songjy.test.socket.thread;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:MultiThreadShareData
 * 多个线程之间共享数据的方式探讨
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-17 上午10:13:54
 */

public class MultiThreadShareData {
	
	private static Log log = LogFactory.getLog(MultiThreadShareData.class);
	
	private static int c = 5;//设定递增和递减的次数
	
	public static void main(String[] args) {

		/* 简单卖票模拟
		 * 
		 * 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个
		 * Runnable对象中有那个共享数据,卖票系统就可以这么做
		 * */
		SellTicket sell = new SellTicket();

		new Thread(sell).start();
		new Thread(sell).start();
		
		final InDe data02 = new InDe();

		/* 递增递减模拟一
		 * 
		 * 将共享数据封装在另一个对象中,然后将这个对象逐一传递给各个Runnable对象,
		 * 每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信
		 * */
		for(int i=0; i<c; i++)
		new Thread(new Runnable() {

			@Override
			public void run() {
				data02.increment();
			}
		}).start();

		for(int i=0; i<c; i++)
		new Thread(new Runnable() {

			@Override
			public void run() {
				data02.decrement();
			}
		}).start();
		
		/* 递增递减模拟二
		 * 
		 * 将共享数据封装在另一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上去去完成,
		 * 对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的成员内部类或局部内部类
		 * */
		
		for(int i=0; i<c; i++)
		new Thread(new MyRunnable01(data02)).start();
		for(int i=0; i<c; i++)
		new Thread(new MyRunnable02(data02)).start();
		
		try {
			Thread.sleep(2 * 1000l);
		} catch (InterruptedException e) {
			log.error(e.getMessage(), e);
		}
		
		log.info(data02.getJ());//等待所有线程结束后输出结果一定是0,否则线程不安全
	}
}

class SellTicket implements Runnable {
	
	private static Log log = LogFactory.getLog(SellTicket.class);

	private int count = 100;

	@Override
	public void run() {

		while (count>0) {
			log.info("售票窗口"+Thread.currentThread().getName()+"正在卖出一张票了,剩余票数:" + count);
			count--;
			log.info("售票窗口"+Thread.currentThread().getName()+"卖出一张票了,剩余票数:" + count);
		}
		
		log.info("所有票已售完");

	}
}

class InDe {

	private static Log log = LogFactory.getLog(InDe.class);
	private int j = 0;

	public int getJ() {
		return j;
	}

	public void setJ(int j) {
		this.j = j;
	}

	public void increment() {
		log.info(Thread.currentThread().getName()+"递增前结果:"+j);
		j++;
		log.info(Thread.currentThread().getName()+"递增后结果:"+j);
	}

	public void decrement() {
		log.info(Thread.currentThread().getName()+"递减前结果:"+j);
		j--;
		log.info(Thread.currentThread().getName()+"递减后结果:"+j);
	}
}

class MyRunnable01 implements Runnable{

	private InDe data;

	MyRunnable01(InDe data) {
		this.data = data;
	}
	
	@Override
	public void run() {
		data.increment();
	}
	
}

class MyRunnable02 implements Runnable{

	private InDe data;

	MyRunnable02(InDe data) {
		this.data = data;
	}
	
	@Override
	public void run() {
		data.decrement();
	}
	
}


多个线程之间共享数据的方式探讨
分享到:
评论

相关推荐

    多线程之间的线程通信

    "多线程之间的线程通信"是确保多个线程协同工作、避免数据不一致性和提高程序效率的关键概念。在本话题中,我们将深入探讨线程通信的原理、方法,以及潜在的危险。 首先,线程通信是指在一个进程中,不同的线程之间...

    MFC 多线程之间通过消息传递数据

    本主题将深入探讨如何在MFC的多线程环境中通过消息传递来交换数据。 首先,我们要了解MFC对多线程的支持。MFC提供了一个CWinThread类,它是所有线程的基础。创建新线程时,通常会从CWinThread派生一个新的类,并...

    易语言多线程传递自定义数据(免加延时方法)

    2. **全局变量或共享内存**:如果数据量较大或者需要在多个线程间共享,可以使用全局变量或者共享内存区域。这种方式需要注意线程同步问题,以防止多个线程同时读写同一数据导致的数据冲突。易语言提供了“互斥量”...

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

    在这个"多线程互斥实例 多线程获取同一变量"的示例中,我们将探讨如何在多个线程中安全地访问共享资源,避免数据不一致性和竞态条件。 首先,我们需要理解多线程中的一些核心概念: 1. **线程**:线程是操作系统...

    Delphi多个DLL共享全局数据Demo

    5. **线程同步**:当多个线程可能同时访问共享数据时,必须使用线程同步机制,如互斥量(Mutex)、信号量(Semaphore)或事件对象(Event),以防止数据竞争和不一致。 6. **导出和导入函数**:在DLL中,需要使用`...

    NET中多线程间资源共享与访问

    在多线程环境中,多个线程可能需要同时访问相同的资源,例如内存变量、文件系统或数据库连接等。如果不加以控制,这种并发访问可能会导致数据不一致和其他问题,如死锁、竞态条件等。因此,实现线程间的资源共享和...

    qt 多线程共享全局缓冲区

    在Qt框架中,多线程(Multithreading)是一种重要的技术,它允许应用程序同时执行多个任务,提升程序的效率和响应性。特别是在处理耗时计算或者I/O操作时,多线程能显著改善用户体验。本篇文章将深入探讨如何在Qt ...

    易语言线程返回数据的方法

    总结,易语言线程返回数据的方法涉及到线程的创建、数据共享机制和同步策略等多个方面。开发者需要根据实际需求选择合适的方法,确保数据正确、安全地从线程返回。对于源码的学习和实践,是提升编程技能的有效途径。

    java多线程处理数据库数据

    线程是程序执行的最小单位,一个进程可以包含多个线程。在Java中,我们可以使用`Thread`类或者`Runnable`接口来创建线程。然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`...

    多个DELPHI程序间的变量共享

    在DELPHI编程环境中,有时候我们需要在多个程序之间共享数据或变量,这通常是由于应用程序间的协同工作、数据传递或是为了优化资源管理。本教程将深入探讨如何实现多个DELPHI程序间的变量共享。 首先,我们要了解...

    多线程资源共享集合

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

    C#的多线程示例;几个多线程之间的互斥,同步;WPF主界面INVOKE

    这防止了多个线程对同一资源的竞态条件,确保数据的一致性。 同步则是控制线程执行顺序和协调的方式。C#提供了多种同步机制,如`Monitor`、`Semaphore`和`Mutex`等。其中,`Monitor`使用了.NET框架的锁对象,可以...

    多线程处理数据(工具)样例

    1. **线程安全**:当多个线程访问共享数据时,必须确保数据的一致性和完整性。为此,可以使用锁、信号量、原子操作等同步机制,防止数据竞争。 2. **负载均衡**:在分配任务给线程时,要尽可能使每个线程的工作负载...

    javaSocket的Tcp通信方式两个线程,一个线程接收数据一个线程发送数据

    在"javaSocket的Tcp通信方式两个线程,一个线程接收数据一个线程发送数据"这个场景下,我们将探讨如何通过多线程来优化TCP通信的效率和响应性。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠...

    JAVA多线程实现数据库之间的数据互导、连接池、及多表插入数据库功能

    - **连接池概念**:连接池预先初始化一定数量的数据库连接,供多个线程共享,避免频繁创建和销毁连接的开销。 - **常用连接池组件**:例如C3P0、Druid、HikariCP等,它们提供自动管理、监控、性能优化等功能。 - ...

    多线程之间消息通信

    然而,当多个线程需要共享数据或协调工作时,线程间的通信就变得至关重要。"多线程之间消息通信"这一主题主要探讨了如何在不同线程间传递信息,实现有效的协作。 线程间通信(Inter-Thread Communication,ITC)是...

    windowsC++多线程加锁信号量共享内存

    在多线程环境中,当多个线程需要访问同一块内存时,就出现了共享内存。这种共享使得线程间通信更为直接,但也可能导致数据不一致,因此需要适当的同步机制。 这就引出了加锁的概念。在C++中,互斥锁(Mutex)是一种...

    JAVA多线程探讨 (2).pptx

    当多个线程访问共享资源时,可能会产生竞态条件,导致数据不一致。Java提供了同步机制来解决这个问题,包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)等。例如,以下代码中的`next()`方法可能引发竞态...

    Python自学教程-10-线程之间共享全局变量数据出现错误问题.ev4.rar

    1. **数据竞争**:当两个或多个线程试图同时修改一个全局变量时,由于线程调度的随机性,可能会导致最终结果不符合预期。例如,线程A读取变量值,然后线程B修改了这个值,但线程A在计算后仍用旧值更新变量,这就会...

    跨线程提交数据

    跨线程提交数据涉及到两个或多个线程之间共享和修改同一份数据。这通常需要特殊的同步机制,以防止竞态条件和死锁。竞态条件是指当两个或更多线程同时访问和修改同一资源时,结果依赖于线程的执行顺序,可能导致不...

Global site tag (gtag.js) - Google Analytics