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编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....
本项目"多线程+委托+进度条+线程安全"正是针对这种需求而设计的。 首先,我们来详细探讨多线程。在Windows环境下,Win32 API提供了CreateThread函数来创建新的线程,而.NET框架则提供了System.Threading命名空间,...
在本案例中,介绍了一种使用委托的方法来安全地更新 UI 元素(特别是 ListBox 控件),以实现多线程操作。 #### 关键概念解析 **1. 多线程基础:** - **线程** 是程序执行流的基本单元,一个程序至少有一个线程...
在C#编程中,多线程、委托和回调是三个重要的概念,它们在构建高性能、响应迅速的应用程序中起着至关重要的作用。本资源包"多线程-委托-回调实例.zip"似乎提供了一些示例代码,帮助学习者深入理解这些主题。 1. **...
此外,`volatile`关键字可用于确保多线程环境中的数据一致性,确保所有线程都能看到最新值。 在Windows Forms应用程序中,主线程(UI线程)负责更新用户界面。因此,长时间运行的操作不应在主线程上执行,以免阻塞...
例如,Web浏览器在下载Java小程序或图片的同时滚动页面,访问新页面时播放动画和声音,以及打印文件等操作,正是多线程能力的体现。这不仅提升了用户体验,也最大化了硬件资源的利用。 #### 多线程的潜在挑战 尽管...
"C#多线程委托"是一个关于如何在C#中使用多线程和委托来实现后台任务和更新用户界面的实例。理解并熟练运用这些技术,可以提升应用程序的性能和用户体验,尤其是在处理耗时操作时。在Windows Forms应用中,正确地...
本实例主要关注如何在VB.NET中实现多线程,通过创建并运行三个具有类似功能的方法——TestMethod1、TestMethod2和TestMethod3,来演示如何利用多线程来并发地进行输出操作。 1. **线程基础知识**:线程是程序执行的...
而多线程技术是现代软件开发中不可或缺的一部分,尤其是在处理耗时任务或者并发操作时,多线程能够显著提高程序的效率和响应性。"VB多线程实例 - VBThread1"是一个专门探讨如何在VB环境中实现多线程功能的示例项目。...
委托可以实现事件处理和回调机制,同时也是实现多线程同步和异步操作的关键工具。 在多线程编程中,`ThreadPool`和`Task`类经常与委托一起使用。`ThreadPool`提供了一种池化的线程资源,可以高效地复用线程,而`...
在这个特定的案例中,我们探讨的是如何利用C#的委托和多线程技术来创建一个摇奖器应用。首先,理解委托的概念至关重要。委托在C#中相当于函数指针,允许我们将方法作为参数传递,或者存储在一个变量中,这为事件处理...
总结来说,"多线程更新UI--不错的例子"是一个演示如何在.NET Framework 2.0的Windows Forms环境下利用多线程进行后台操作,并通过适当的方法安全地更新UI的实例。开发者可以通过这个例子学习到如何提高应用程序的...
在编程领域,多线程和委托是两种非常重要的概念,特别是在C#这样的.NET环境中,它们被广泛用于构建高效、响应迅速的应用程序。本篇将详细阐述这两个概念及其在实际项目中的应用。 首先,多线程是指在一个应用程序中...
1. **委托与多线程**:在.NET框架中,委托是一种类型安全的函数指针,可以用于传递方法作为参数。在多线程环境中,委托常被用作启动新线程的手段。通过创建Thread对象并使用Start方法,或使用ThreadPool类,开发者...
在描述中提到的"安全的多线程操作",主要是指通过上述各种方式确保线程的正常运行,避免数据冲突,防止程序崩溃,以及优化性能。通过学习和应用这些概念,开发者可以在VB中构建出高效、稳定且响应迅速的多线程应用...
综上所述,本示例展示了如何使用Windows Forms创建一个简单的中奖程序,其中涉及到了界面设计、多线程处理以及跨线程访问等关键技术点。虽然代码中使用了一些已废弃的方法,但整体逻辑清晰,有助于理解这些概念的...
在C#中,多线程委托也是实现并发编程和异步操作的关键技术,例如ThreadPool类和Task Parallel Library (TPL)。ThreadPool提供了一种高效的方式来管理线程,而TPL通过Parallel和Task类提供了更高级别的并行编程抽象,...
本重新为vb.net多线程委托托管实例源码,主要有以下功能模块: 1.Thread多线程技术功能模块, 2.3个实例窗体如何进行委托托管及参数传输功能模块 3.告诉你如何屏蔽错误及不屏蔽错误,如何跨窗口运行。程序以最...
这里我们将详细探讨如何实现“简单C# WinForm多线程委托调用进度条”。 首先,我们需要理解多线程的概念。在C#中,`System.Threading`命名空间提供了对线程的支持。主线程是应用程序的主要执行流,而额外创建的线程...
.NET框架提供了线程安全的集合类,如`ConcurrentQueue`、`ConcurrentStack`、`ConcurrentDictionary`等,它们在多线程环境下能保证数据一致性。 八、线程异常处理 1. **ThreadAbortException**:当调用`Thread....