`

多线程访问共享数据

    博客分类:
  • J2SE
阅读更多

多线程访问共享数据方式总结:

 

1.若每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,如卖票系统.

2.若每个线程执行的代码不同,这时需要用不同的Runnable对象,有以下几种方式来实现这些Runnable对象之间的数据共享:

2.1将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象上去完成,这样容易实现针对该数据进行的各种操作的互斥与通信.

2.2将这些Runnable对象作为一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各种操作的互斥与通信.

总之,要同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样容易实现针对该数据进行的各种操作的互斥与通信.

 

如简单的卖票系统实现

public class Ticket {
	private int ticket = 10;

	private Lock lock = new ReentrantLock();

	public void getTicket() {
		lock.lock();
		try {
			Thread.sleep(1000);

			if (ticket > 0) {
				System.out.println(Thread.currentThread().getName()
						+ "买票:ticket = " + ticket--);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}

	}
}
 
public class MyLock implements Runnable{
	
    private Ticket ticket = new Ticket();  
      
    public void run() {  
        for (int i = 0; i < 10; i++) {
            // 买票  
            ticket.getTicket();
        }  
    }
    
    public static void main(String[] args) {
		MyLock lock = new MyLock();
		Thread t1 = new Thread(lock);
		Thread t2 = new Thread(lock);
		Thread t3 = new Thread(lock);
		t1.start();
		t2.start();
		t3.start();
	}
}
 
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    qt线程共享数据 信号和槽方式

    Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容。Qt线程间共享数据主要有两种方式: 使用共享内存。即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到...

    Qt 多线程访问同一个变量

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

    易语言多线程访问网页

    这个子程序可能包含了网络请求、数据解析、错误处理等步骤,是多线程访问网页的核心部分。 5. **异步编程**:为了防止主线程被长时间阻塞,多线程访问通常采用异步编程模型。易语言提供了异步调用的机制,如“异步...

    java多线程文件传输

    - **共享资源**:多线程访问共享数据可能导致数据不一致,需使用同步机制确保数据的一致性。 - **死锁**:当两个或更多线程互相等待对方释放资源导致无法继续执行的状态,应避免死锁的发生。 4. **并发工具类** ...

    winform 多线程处理数据

    - 为避免资源竞争,确保线程安全,特别是在多个线程访问共享数据时。 通过理解和应用这些概念,开发者可以构建出高效且用户体验良好的WinForm应用,即使在处理大量数据时也能保持界面的响应性。

    多线程导入excel 数据

    - **同步锁的概念**:在多线程环境下,当共享资源访问需要保持一致性时,可以使用同步锁。Java中的`synchronized`关键字可实现此功能,它能保证同一时刻只有一个线程执行特定代码段。 - **锁的应用**:在读取或...

    Java多线程编程之访问共享对象和数据的方法

    本篇将详细介绍两种线程访问共享对象和数据的情况,并通过代码实例进行解析。 1. **线程执行相同代码的情况**: 在这种情况下,多个线程执行的任务相同,如多个售票窗口同时售卖同一组票。这时,可以创建一个包含...

    多线程操作共享文件.zip

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

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

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

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

    - **Mutex类**:这是一个跨进程的同步对象,可以用来协调不同进程中的线程访问共享资源。`Mutex`类通常用于需要更细粒度控制的情况。 示例代码: ```csharp Mutex objMutex = new Mutex(false, "ThreadLock"); ...

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

    3. **共享数据与线程同步**:使用全局变量或共享内存,配合同步原语避免数据冲突。 4. **事件驱动编程**:利用事件替代延时,提高线程的利用率。 理解并掌握这些知识点,开发者就能在易语言中高效地编写多线程程序...

    多线程同步大量数据转录的多线程和同步

    标题与描述均提到了“多线程同步大量数据转录”的概念,这涉及到在计算机科学领域中的并发编程技术,特别是如何有效地处理大规模数据集的转录工作。在现代软件开发中,多线程同步机制是优化性能、提高系统吞吐量的...

    qt 多线程共享全局缓冲区

    另外,Qt还提供了QSharedMemory和QSystemSemaphore等高级同步机制,适用于跨进程的共享数据。这些工具可以帮助你在多进程环境中实现全局缓冲区的共享,但要注意它们的使用方式和线程安全问题。 总结来说,Qt 5.12.3...

    java多线程处理数据库数据

    1. **线程安全**:由于多线程环境下可能存在数据竞争,所以在访问共享资源(如数据库连接)时,需要确保线程安全。可以使用`synchronized`关键字或者`Lock`来同步访问。 2. **事务管理**:在多线程环境中,可能需要...

    java多线程设计模式详解

    5. **读写锁模式**:在多线程访问共享数据时,读操作通常比写操作更频繁且不会改变数据。ReentrantReadWriteLock提供了一种读写分离的锁机制,允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 6. **...

    多线程资源共享集合

    `synchronized`关键字是Java中用来控制多线程并发访问共享资源的一种机制。它提供了互斥访问,确保同一时间只有一个线程可以执行特定代码块。`synchronized`可以修饰方法或者代码块,当一个线程进入`synchronized`...

    多线程访问网页

    本文将深入探讨多线程访问网页这一主题,涵盖其原理、实现方式以及在实际应用中的挑战与优化策略。 一、多线程的基本概念 多线程是操作系统提供的一个特性,允许单个程序创建多个并发执行的线程。每个线程都有自己...

    COM多线程访问演示

    多线程访问的难点在于管理和协调线程间的交互,防止数据损坏。例如,当一个线程正在修改一个对象时,其他线程必须等待其完成才能进行操作,这就需要用到线程同步原语。此外,还需要注意异步回调、线程间的通信以及...

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

    通过比较使用临界区和不使用临界区的情况,我们可以观察到线程安全访问共享资源的重要性。不使用临界区时,可能会出现数据不一致、资源冲突等问题,导致程序运行错误或者结果不可预测。而在正确使用临界区后,尽管...

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

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

Global site tag (gtag.js) - Google Analytics