`

135_多线程(多线程的安全问题)

阅读更多
class TWindow implements Runnable{
	private int ticketNum =100;
	
	public void run(){
		while(true){
			if(ticketNum > 0)
				System.out.println(Thread.currentThread().getName()
				+" sale "+ ticketNum--);
		}
	}
}

class ThreadDemo{
	public static void main(String[] args){
		TWindow t = new TWindow();
		
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}



安全隐患:见附件截图
/*
通过分析发现,打印出0,-1,-2等错票

多线程的运行出现了安全问题

问题的原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句
只执行一部分,还没执行完,另一个线程参与进来执行,导致共享
数据的错误。

解决办法:
对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程
中,其它线程不可以参与执行。

java对于多线程的安全问题提供了解决方式,就是同步代码块。
synchronized(对象)
{
	需要被同步的代码
}
对象如同锁,只有锁的线程可以在同步中执行。
没有锁的线程即使有cpu使用权,也进不去,因为没有锁。

同步的前提:
1.必须要有两个或两个以上的线程
2.必须是多个线程使用同一个锁

必须保证同步中只能有一个线程在运行

好处:解决了多线程的安全问题
弊端:多个线程需要判断锁,较为消耗资源

*/
class TWindow implements Runnable{
	private int ticketNum =100;
	Object obj = new Object();
	public void run(){
		while(true){
			sychronized(obj){
				if(ticketNum > 0){
					try{
						Thread.sleep(10);
					}
					catch(Exception e){
						
					}
					System.out.println(Thread.currentThread().getName()
					+" sale "+ ticketNum--);
				}
			}
		}
	}
}

class ThreadDemo{
	public static void main(String[] args){
		TWindow t = new TWindow();
		
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

  • 大小: 2.6 MB
分享到:
评论

相关推荐

    pi.rar_PI_linux 多线程_多线程_多线程求pi

    多线程求π的过程中,还需要考虑线程安全问题。当多个线程同时写入或读取共享数据时,可能会出现竞态条件,导致结果不准确。因此,可能需要使用互斥锁(mutex)或条件变量(condition variable)来保护共享资源,...

    mp.rar_socket 多线程_tcp 多线程_tcp 线程_多线程 Socket_网络 扫描器

    标题中的“mp.rar_socket 多线程_tcp 多线程_tcp 线程_多线程 Socket_网络 扫描器”表明这是一个关于使用多线程Socket编程实现TCP网络扫描器的项目。TCP扫描器通常用于网络安全检测,通过尝试与目标主机建立连接,...

    DELPHI下的多线程程序设计2.rar_delphi 多线程_多线程_多线程 delphi_多线程+delphi

    学习Delphi的多线程编程不仅可以提升应用程序的性能,还能帮助开发者解决复杂的并发问题。理解并熟练运用TThread类和相关的同步机制是Delphi开发人员必备的技能之一。通过阅读这些教程和资料,开发者将能更深入地...

    ftp.rar_FTP 多线程_FTp多线程_ftp vc_多线程 ftp

    6. 多线程安全:处理并发访问同一资源时可能出现的竞争条件,如锁和同步机制的应用。 在开发这样的应用时,开发者需要深入理解FTP协议规范,掌握VC++的多线程编程技巧,以及如何在实际网络环境中优化文件传输性能。...

    vb4ThreadDown_visualbasic_多线程下载_多线程_

    在VB(Visual Basic)编程环境中,多线程技术是一种关键的高级特性,它允许应用程序同时执行多个任务,显著...在实际应用中,开发者还需要考虑性能优化、资源管理以及兼容性等问题,以构建更加完善的多线程下载程序。

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到解决方案。在Java中,多线程设计模式的应用能够提升系统的性能、可扩展性和可维护性。 一、线程基础 在Java中...

    multi_test.rar_多线程 MFC_多线程 扫描_多线程程序_端口扫描程序

    同时,你也会了解到如何处理线程安全问题,避免竞态条件和死锁的发生,这对于任何多线程编程都是至关重要的。 总结一下,这个压缩包提供了使用MFC进行多线程编程的实际案例,特别是针对端口扫描的应用。通过研究和...

    CoProc_MultiThread_autoit3_autoit_多线程_au3多线程_au3_

    在标题和描述中提到的“CoProc_MultiThread_autoit3_autoit_多线程_au3多线程_au3_”主题,重点是使用 AutoIt 3 来实现多线程功能。在AutoIt中,多线程是非常有用的,它允许脚本同时执行多个任务,提高程序的效率和...

    QT.rar_QT 多线程_QT 多线程_QT线程_qt多线程_多线程qt

    QT是Qt库的缩写,它是一个开源的...QT的多线程机制为开发者提供了强大的工具,但也需要谨慎处理,以防止出现潜在的并发问题。通过深入理解这些知识点,开发者能够编写出高效、稳定且用户体验良好的多线程QT应用程序。

    duoxiancheng.rar_多线程_多线程卖票

    在描述中提到的“多线程卖票”场景,常见的问题是线程安全。当多个线程试图同时修改同一资源(比如票的数量)时,如果没有适当的同步机制,可能会出现数据不一致的情况。为了解决这个问题,开发者通常会使用互斥锁...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    在多线程环境中,线程间的数据共享和资源访问可能会引发竞态条件和死锁问题。Delphi提供了多种同步机制来解决这些问题,如: 1. 事件(Synchronize):允许线程在主线程中安全地执行代码,确保数据一致性。 2. 互斥...

    CollThread_delphi_多线程_

    3. **同步机制**:由于多线程环境下可能存在数据竞争问题,因此需要使用如TSyncronizedQueue、TCriticalSection或TMonitor等同步组件来确保数据的安全访问。 4. **事件通知**:线程可能通过发布事件或者使用回调函数...

    server_c_Linux.rar_linux 多线程_多线程 服务器_多线程通信

    2. **线程同步**:由于多线程环境下可能会存在数据竞争,因此需要使用`pthread_mutex_t`互斥锁或`pthread_rwlock_t`读写锁来保护共享资源的安全性,确保同一时刻只有一个线程访问。 3. **套接字编程**:服务器会...

    CollThread_delphi_delphi多线程_多线程_

    为了保证线程安全,开发人员可能使用锁或其他同步原语来保护共享资源,防止数据竞争和死锁的发生。 在压缩包中的"CollThread"文件可能是整个项目的源代码文件,包含了实现多线程数据采集和显示的相关单元、类、函数...

    MTS.rar_多线程 传输_多线程 文件传输_多线程文件传输_文件传输

    在IT领域,多线程技术是提升程序性能和效率的重要手段,特别是在文件传输场景中。本文将详细讨论“MTS.rar”压缩包所涉及的多线程文件传输的知识点,包括多线程的概念、实现原理以及它在文件传输中的应用。 多线程...

    DSLDirectiveProcessor.zip_.net_c# 多线程_多线程 C#

    标题中的“DSLDirectiveProcessor.zip_.net_c# 多线程_多线程 C#”暗示了这是一个关于C#编程语言的项目,特别关注于.NET框架下的多线程处理。这个压缩包可能包含了实现多线程处理的一个或多个类库,其中的核心组件...

    ListCtrl多线程.rar_C++ 线程 控件_ListCtrl线程_列表控件_多线程 数据_多线程程序

    在多线程环境中,数据访问需要确保线程安全,防止竞态条件。这里我们使用互斥量(`std::mutex`)来实现线程同步。当一个线程正在访问ListCtrl时,其他线程必须等待,直到互斥量解锁。`std::lock_guard`是自动管理锁...

    tcp_test.rar_java tcp 多线程_java tcp 线程_tcp 多线程_tcp线程_多线程 TCP

    而多线程技术可以解决这个问题,通过为每个客户端创建一个新的线程,服务器可以并发地处理多个客户端连接,显著提高服务效率。 在Java中,创建多线程的方式有继承`Thread`类或实现`Runnable`接口。对于TCP服务器,...

    一个多线程的后台管理扫描器.rar_delphi 多线程_delphi 后台_delphi多线程_后台扫描_多线程delphi

    标题中的“一个多线程的后台管理扫描器.rar_delphi 多线程_delphi 后台_delphi多线程_后台扫描_多线程delphi”表明这是一个基于Delphi编程语言开发的多线程应用程序,主要功能是后台扫描。Delphi是一款强大的Windows...

    网口通信(多线程)_socket通讯_多线程_

    多线程的使用需要注意线程安全问题,例如资源共享和竞态条件。为了防止数据冲突,可能需要使用同步机制,如synchronized关键字或者java.util.concurrent并发工具类。此外,还要关注线程生命周期管理,避免资源浪费和...

Global site tag (gtag.js) - Google Analytics