`

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

    博客分类:
  • 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();
	}
}

 

分享到:
评论

相关推荐

    linux线程同步.pdf

    数据竞争是指两个或多个线程同时访问同一个共享资源,并且至少有一个线程在写操作时,没有适当的同步机制来保护该资源。死锁是指两个或多个线程相互等待对方释放资源,导致无法继续执行的情况。饥饿是指一个线程因为...

    java学习多线程处理

    多线程开发的优势:改善用户体验,提高资源利用率(单线程的处理效率低下) 线程的使用步骤:定义一个线程,创建线程的实例,启动线程,终止线程 主线程:(java中所有的线程都是java.lang.Thread类或者其子类的一...

    LInux 平台下物联网网关(多线程实现),嵌入式项目

    应用于物联网嵌入式项目 包括参数数据解析、协议转换、Socket收发、Sqlite、Uart、Camera等操作&UI界面。 Linux物联网网关是基于Linux操作系统的嵌入式...互斥锁和条件变量用于确保线程之间的同步和互斥访问共享资源。

    Python多线程同步Lock、RLock、Semaphore、Event实例

    Lock & RLock :用来确保多线程多共享资源的访问。 Semaphore : 用来确保一定资源多线程访问时的上限,例如资源池。  Event : 是最简单的线程间通信的方式,一个线程可以发送信号,其他的线程接收到信号后执行操作...

    Java毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传.rar

    1. 多线程下载:项目使用Java的多线程功能,将文件分成多个部分,每个部分由一个线程负责下载。这样可以充分利用网络带宽,提高下载速度。 2. 线程安全:项目中的多个线程需要共享资源,如文件、网络连接等。为了...

    linux之线程同步的概要介绍与分析

    在Linux操作系统中,线程同步是多线程编程中的一个核心概念,它确保了多个线程在访问共享资源时的正确性与一致性,避免了诸如数据竞争和竞态条件等问题。为了实现这一目标,Linux提供了一系列强大的线程同步机制和...

    Linux多线程同步方式

    而操作系统对于多线程不会自动帮我们串行化,所以需要我们通过操作系统提供的同步方式api,结合自己的业务逻辑,利用多线程提高性能的同时,保证业务逻辑的正确性。一般而言,linux下同步方式主要有4种,原子锁,...

    三峡大学2023操作系统期末复习知识点+打印店习题部分总结

    在操作系统中,信号量是一种广泛使用的同步机制,用于控制对共享资源的访问,尤其是在多线程和多进程环境中。信号量主要用于解决两个基本问题:互斥(mutual exclusion)和同步(synchronization)。 读者-写者问题...

    操作系统的基本原理.doc

    因此,系统必须为进程提供 同步机构,以确保进程能协调操作和共享资源。 (4)、一个进程至少要对应一个或多个程序。不同的进程可以调用同一个程序,但 该程序必须在不同的数据集合上执行。 (5)、程序和进程的关系...

    嵌入式面试资料(嵌入式程序员面试须知)

    当两个或多个线程需要访问同一资源时,它们需要以某种顺序来确保该资源某一时刻只能被一个线程使 用的方式称为同步。 一面,技术面 (1)VxWorks、uc/OS、Palm嵌入式系统操作系统的区别? 我的课题是做vxworks,说了...

    JAVA网络编程课程设计

    其中服务端为解决多线程操作共享资源,确保线程安全摒弃资源消耗大的Synchronized使用ConcurrentHashMap存放Socket对象。 服务端: (1)连接客户端:实现与客户端的Socket通信。 (2)管理客户端:实现通过线程池...

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    java-servlet-api.doc

    一个Servlet环境不能在虚拟主机之间共享。 Servlet引擎能够允许一个Servlet环境有它自己的活动范围。 例如,一个Servlet环境是属于bank应用的,它将被映射到/bank目录下。在这种情况下,一个对getContext方法的调用...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    Java开发技术大全(500个源代码).

    commSource.java 一个共享资源的类 demoSynchrony.java 演示线程的同步 setDataThread.java 设置数据的线程类 readDataThread.java 读取数据的线程类 demoEnhanceThread.java 使用自己定义的线程类示例 ...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    java,c/c++,php,c#安全编码规范

    2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止线程 26 2.6.4 确保执行阻塞操作的线程可以终止 26 2.6.5 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    14.4.2 将多个对象格式成一个字符串 14.4.3 提供定制格式化器 14.5 解析字符串来获取对象:Parse 14.6 编码:字符和字节的相互转换 14.6.1 字符和字节流的编码和解码 14.6.2 Base-64字符串编码和解码 14.7 ...

    Hyper-V虚拟化技术

    可在一个虚拟机环境中最多支持四个多处理器,使您可以在虚拟机中完整享受到多线程应用程序的优势。 ·新的硬件共享架构. 通过使用新的虚拟服务供应程序/虚拟服务客户端(VSP/VSC)架构,Hyper-V增强了核心资源的访问...

Global site tag (gtag.js) - Google Analytics