`

多线程操作---委托线程安全

阅读更多
1.使用复制来保证线程安全

class MonitorVehicleTracker{
	private final Map<String,MutablePoint> locations;
	
	public MonitorVehicleTracker(Map<String,MutablePoint> locations){
		this.locations = deepCopy(locations);
	}
	public synchronized Map<String,MutablePoint> getLocations(){
		//我拥有的是外界传给我的拷贝,所以外界的locations改变了也不会影响我
		return deepCopy(locations);
	}
	
	public synchronized MutablePoint getLocation(String id){
		MutablePoint loc = locations.get(id);
		//传出去的也是一份拷贝,也意味着通过这个方法,外界只能看locations里面的数据,而不能改
		return loc==null?null:new MutablePoint(loc);
	}
	
	public synchronized void setLocation(String id,int x,int y){
		//只能通过这个接口才能改location数据,保证了修改的可控性
		MutablePoint loc = locations.get(id);
		if(loc==null)
			throw new IllegalArgumentException("No such ID:"+id);
		loc.x=x;
		loc.y=y;
	}
	
	private static Map<String ,MutablePoint> deepCopy(Map<String,MutablePoint> m){
		Map<String ,MutablePoint> result = new HashMap<String,MutablePoint>();
		for(String id:m.keySet())
			result.put(id,new MutablePoint(m.get(id)));
		return Collections.unmodifiableMap(result);//这个map不允许增加或者减少元素
	}
}
class MutablePoint{
	public int x,y;
	public MutablePoint(){
		x=0;y=0;
	}
	public MutablePoint(MutablePoint p){
		this.x=p.x;
		this.y=p.y;
	}
}


2.缩小同步范围
class MonitorVehicleTracker{
	private final Map<String,MutablePoint> locations;
	private final Map<String,MutablePoint> unmodifiableMap;
	public MonitorVehicleTracker(Map<String,MutablePoint> locations){
		this.locations = new ConcurrentHashMap<String,MutablePoint>(locations);
		this.unmodifiableMap = Collections.unmodifiableMap(locations);
	}
	public /*synchronized*/ Map<String,MutablePoint> getLocations(){
		 
		return this.unmodifiableMap;
	}
	
	public /*synchronized*/ MutablePoint getLocation(String id){
		return locations.get(id);
	}
	
	public /*synchronized*/ void setLocation(String id,int x,int y){
		 
		MutablePoint loc = locations.get(id);
		if(loc==null)
			throw new IllegalArgumentException("No such ID:"+id);
		loc.set(x, y); //只有这一小段同步了
	}
	
	private static Map<String ,MutablePoint> deepCopy(Map<String,MutablePoint> m){
		Map<String ,MutablePoint> result = new HashMap<String,MutablePoint>();
		for(String id:m.keySet())
			result.put(id,new MutablePoint(m.get(id)));
		return Collections.unmodifiableMap(result);//这个map不允许增加或者减少元素
	}
}
class MutablePoint{
	public int x,y;
	public MutablePoint(){
		x=0;y=0;
	}
	public MutablePoint(MutablePoint p){
		this.x=p.x;
		this.y=p.y;
	}
	public synchronized void set(int x,int y){
		this.x=x;
		this.y=y;
	}
}
分享到:
评论

相关推荐

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....

    多线程+委托+进度条+线程安全------多线程给进度条赋值,考虑到线程安全

    本项目"多线程+委托+进度条+线程安全"正是针对这种需求而设计的。 首先,我们来详细探讨多线程。在Windows环境下,Win32 API提供了CreateThread函数来创建新的线程,而.NET框架则提供了System.Threading命名空间,...

    c# 委托访问listbox多线程操作

    在本案例中,介绍了一种使用委托的方法来安全地更新 UI 元素(特别是 ListBox 控件),以实现多线程操作。 #### 关键概念解析 **1. 多线程基础:** - **线程** 是程序执行流的基本单元,一个程序至少有一个线程...

    多线程-委托-回调实例.zip

    在C#编程中,多线程、委托和回调是三个重要的概念,它们在构建高性能、响应迅速的应用程序中起着至关重要的作用。本资源包"多线程-委托-回调实例.zip"似乎提供了一些示例代码,帮助学习者深入理解这些主题。 1. **...

    C#内存释放-线程控制-线程启动-线程暂停

    此外,`volatile`关键字可用于确保多线程环境中的数据一致性,确保所有线程都能看到最新值。 在Windows Forms应用程序中,主线程(UI线程)负责更新用户界面。因此,长时间运行的操作不应在主线程上执行,以免阻塞...

    C#多线程探索---讲诉多线程

    例如,Web浏览器在下载Java小程序或图片的同时滚动页面,访问新页面时播放动画和声音,以及打印文件等操作,正是多线程能力的体现。这不仅提升了用户体验,也最大化了硬件资源的利用。 #### 多线程的潜在挑战 尽管...

    C#多线程委托

    "C#多线程委托"是一个关于如何在C#中使用多线程和委托来实现后台任务和更新用户界面的实例。理解并熟练运用这些技术,可以提升应用程序的性能和用户体验,尤其是在处理耗时操作时。在Windows Forms应用中,正确地...

    多线程-VB.net开发实例_vb.net多线程_

    本实例主要关注如何在VB.NET中实现多线程,通过创建并运行三个具有类似功能的方法——TestMethod1、TestMethod2和TestMethod3,来演示如何利用多线程来并发地进行输出操作。 1. **线程基础知识**:线程是程序执行的...

    VB多线程实例 - VBThread1

    而多线程技术是现代软件开发中不可或缺的一部分,尤其是在处理耗时任务或者并发操作时,多线程能够显著提高程序的效率和响应性。"VB多线程实例 - VBThread1"是一个专门探讨如何在VB环境中实现多线程功能的示例项目。...

    NET多线程与委托实例

    委托可以实现事件处理和回调机制,同时也是实现多线程同步和异步操作的关键工具。 在多线程编程中,`ThreadPool`和`Task`类经常与委托一起使用。`ThreadPool`提供了一种池化的线程资源,可以高效地复用线程,而`...

    C# 窗体程序Winform 委托和多线程练习-摇奖器案例源码

    在这个特定的案例中,我们探讨的是如何利用C#的委托和多线程技术来创建一个摇奖器应用。首先,理解委托的概念至关重要。委托在C#中相当于函数指针,允许我们将方法作为参数传递,或者存储在一个变量中,这为事件处理...

    多线程更新UI--不错的例子

    总结来说,"多线程更新UI--不错的例子"是一个演示如何在.NET Framework 2.0的Windows Forms环境下利用多线程进行后台操作,并通过适当的方法安全地更新UI的实例。开发者可以通过这个例子学习到如何提高应用程序的...

    多线程以及委托的应用

    在编程领域,多线程和委托是两种非常重要的概念,特别是在C#这样的.NET环境中,它们被广泛用于构建高效、响应迅速的应用程序。本篇将详细阐述这两个概念及其在实际项目中的应用。 首先,多线程是指在一个应用程序中...

    ASP.Net 多线程-IIS搭建-线程池-video

    1. **委托与多线程**:在.NET框架中,委托是一种类型安全的函数指针,可以用于传递方法作为参数。在多线程环境中,委托常被用作启动新线程的手段。通过创建Thread对象并使用Start方法,或使用ThreadPool类,开发者...

    VB多线程操作

    在描述中提到的"安全的多线程操作",主要是指通过上述各种方式确保线程的正常运行,避免数据冲突,防止程序崩溃,以及优化性能。通过学习和应用这些概念,开发者可以在VB中构建出高效、稳定且响应迅速的多线程应用...

    中奖程序,form编程,多线程操作

    综上所述,本示例展示了如何使用Windows Forms创建一个简单的中奖程序,其中涉及到了界面设计、多线程处理以及跨线程访问等关键技术点。虽然代码中使用了一些已废弃的方法,但整体逻辑清晰,有助于理解这些概念的...

    多线程委托

    在C#中,多线程委托也是实现并发编程和异步操作的关键技术,例如ThreadPool类和Task Parallel Library (TPL)。ThreadPool提供了一种高效的方式来管理线程,而TPL通过Parallel和Task类提供了更高级别的并行编程抽象,...

    vb.net多线程委托托管实例.rar Thread委托托管实例

    本重新为vb.net多线程委托托管实例源码,主要有以下功能模块: 1.Thread多线程技术功能模块, 2.3个实例窗体如何进行委托托管及参数传输功能模块 3.告诉你如何屏蔽错误及不屏蔽错误,如何跨窗口运行。程序以最...

    简单C#winform多线程委托调用进度条

    这里我们将详细探讨如何实现“简单C# WinForm多线程委托调用进度条”。 首先,我们需要理解多线程的概念。在C#中,`System.Threading`命名空间提供了对线程的支持。主线程是应用程序的主要执行流,而额外创建的线程...

    C#多线程教程-源代码

    .NET框架提供了线程安全的集合类,如`ConcurrentQueue`、`ConcurrentStack`、`ConcurrentDictionary`等,它们在多线程环境下能保证数据一致性。 八、线程异常处理 1. **ThreadAbortException**:当调用`Thread....

Global site tag (gtag.js) - Google Analytics