`
jaesonchen
  • 浏览: 311404 次
  • 来自: ...
社区版块
存档分类
最新评论

同步访问共享的可变数据

 
阅读更多
public class Concurrency {
	//方法一:使用volatile关键字,不能执行互斥访问,但能保证看到其他线程修改的结果。
	private static volatile boolean stopRequested;
	//方法二:使用同步synchronized关键字,可以看到其他线程修改的结果(必须同步读写方法)
	private static synchronized void requestStop() {
		stopRequested = true;
	}
	//方法二:使用同步synchronized关键字,可以看到其他线程修改的结果(必须同步读写方法)
	private static synchronized boolean stopRequested() {
		return stopRequested;
	}
	
	//lazy initialization holder class模式
	private static class FieldHolder {
		static final FieldType field = computeFieldValue();
	}
	private static FieldType computeFieldValue() { return new FieldType(); }
	//不需要使用synchronized同步
	static FieldType getField() { return FieldHolder.field; }
	
	public static void main(String[] args) throws InterruptedException {
		Thread backgroundThread = new Thread(new Runnable() {
			public void run() {
				int i = 0;
				while (!stopRequested())
					i++;
				System.out.println("i=" + i);
			}
		});
		backgroundThread.start();
		Thread.sleep(1000);
		requestStop();

		//当你想调用一个线程的start 方法时要多加小心,别弄错成调用这个线程的run 方法了。
		//下面程序块创建了第二个线程,但是它从未启动这个线程。相反地,主线程会调用
		//那个新的线程实例的run 方法,这个run 方法会在主线程中同步地运行。
		synchronized (Concurrency.class) {
			Thread t = new Thread() {
				public void run(){ pong(); }
			};
			t.run();
			System.out.print( "Ping" );
		}
	}
	static synchronized void pong(){
		System.out.print( "Pong" );
	}
}
class FieldType {}

 

 * 同步访问共享的可变数据:当多个线程共享可变数据的时候,每个读或者写数据的线程都必须进行同步。

 * 关键字synchronized可以保证在同一时刻,只有一个线程可以执行对象的某个方法或者代码块。
   正确地使用同步可以保证没有任何方法会看到对象处于不一致的状态中。
 * java规范保证读或者写一个变量是原子性(atomic),除非这个变量是long或者double。
   java规范保证线程在读取原子数据的时候,不会看到任意的数值,但是它并不保证一个线程写入的值

   对于另一个线程将是可见的。
   为了提高性能,在读写原子数据的时候避免使用同步,这个建议是非常危险而且错误的。
 * volatile关键字不执行互斥访问,但它可以保证任何一个线程在读取共享域的时候都将看到最近刚刚被

   写入的值。

***************************************************************************
 * 避免过度同步:在一个被同步的方法或代码块内部,永远不要放弃对客户端的控制。
   在一个被同步的区域内部,不要调用设计成要被覆盖的方法或者是客户端以函数对象的形式提供的方法。
   可以通过将外来方法的调用移出同步的代码块来解决问题。通常你应该在同步区域内做尽可能少的工作。

***************************************************************************
 * 并发工具优先于wait和notify:
 * java1.5提供了更高级的并发工具,可以完成以前必须在wait和notify上必须手写代码来完成的工作。
   java.util.concurrent中的并发集合为标准的接口(List、Map)提供了高性能的并发实现。
   应该优先使用ConcurrentHashMap而不是Collections.sychronizedMap或者Hashtable。
   应该优先使用内部同步的并发集合,而不是使用外部同步的集合。
   应该始终使用wait循环模式来调用wait,永远不要再循环之外调用wait。
   应该总是使用notifyAll代替notify,可以避免来自不相关线程的意外或者恶意等待。

***************************************************************************
 * 线程安全性:
   不可变的:类的实例是不可变的,不需要外部同步。如String。
   无条件的线程安全:类的实例是可变的,但有着足够的内部同步,它的实例可以被并发使用,无需外部

   同步。如Ramdom、ConcurrentHashMap。
   有条件的线程安全:除了有些方法并发访问需要外部同步外,安全级别与无条件的相同。如

   Collections.sychronized包装返回的集合,它的Iterator要求外部同步。
   非线程安全:客户端必须自己实现外部同步来调用每个方法。如ArrayList、HashMap。

***************************************************************************
 * 谨慎使用延迟初始化:如果出于性能的考虑而需要对静态域使用延迟初始化,使用lazy initialization

   holder class模式。
   现代的JVM在初始化holder class的时候,同步域的访问,一旦这个类被初始化,JVM将修补代码,以便

   后续对该域的访问不会导致同步。
 

分享到:
评论

相关推荐

    深入同步访问共享的可变数据分析

    本篇文章是对同步访问共享的可变数据进行了详细的分析介绍,需要的朋友参考下

    Delphi多个DLL共享全局数据Demo

    5. **线程同步**:当多个线程可能同时访问共享数据时,必须使用线程同步机制,如互斥量(Mutex)、信号量(Semaphore)或事件对象(Event),以防止数据竞争和不一致。 6. **导出和导入函数**:在DLL中,需要使用`...

    基于同步的数据共享实现方案概论.pdf

    这导致数据在各个节点间分散,使得传统的数据库链接(如Oracle的DBLink)无法直接用于数据共享,且复杂的数据关联操作变得困难。 在这样的背景下,数据共享主要有两种策略:数据服务化和数据同步冗余。数据服务化是...

    基于区块链的医疗数据共享模型研究.pdf

    由于医疗数据的校验、存储和同步一直是一个难点,因此医疗机构之间的数据共享变得困难。患者、医生和研究人员在访问和共享医疗数据时存在严格的限制,这一过程需要花费大量的资源和时间用于权限审核和数据校验。 ...

    java 线程同步 信号量控制同步

    无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。 线程同步机制可以通过使用锁来实现。锁可以是对象锁、类锁或同步锁。锁的作用是防止多个线程同时访问同一个共享...

    使用分布式文件系统实现数据同步.pdf

    分布式文件系统是现代网络技术中不可或缺的一部分,它允许用户通过单一的访问点来访问网络中多台文件服务器上的数据。这种系统大大提高了数据管理的灵活性和数据的可用性,同时也为数据的负载均衡和数据冗余提供了...

    多数据源数据同步,数据接口

    在IT行业中,多数据源数据同步和数据接口是企业级应用开发中不可或缺的部分,尤其是在大数据时代,数据的整合、共享和实时更新变得至关重要。这里我们将深入探讨如何在Java Spring Boot框架下实现这些功能。 首先,...

    FTP数据同步工具.zip

    3. **数据共享**:通过FTP协议,该工具使得不同系统之间的数据交换变得简单,无论是不同的操作系统还是不同的网络环境,只要支持FTP,就能实现数据共享。 4. **数据备份**:FTP数据同步工具支持数据备份功能,用户...

    多頁面共享sessionStorage並同步至vuex範例

    Vuex是Vue生态中的状态管理库,它提供了一个中心化的存储仓库,使得组件间的状态共享和管理变得更加有序和可控。 在这个"多頁面共享sessionStorage並同步至vuex範例"中,开发者可能使用了以下技术栈: 1. **Vuex**...

    java多线程同步分析

    线程访问共享资源的代码可以相同或不同,关键在于它们是否操作相同的可变数据。 为了更好地理解线程同步,我们可以举几个例子。例如,两个采购员执行相同的工作流程,但他们没有共享资源,因此可以独立工作。但如果...

    .net的同步程序

    在多线程环境中,同步是指协调多个线程对共享资源的访问,避免数据竞争和不一致状态。在.NET中,有多种同步技术可供开发者使用,包括锁(Mutex, Monitor, Semaphore)、事件(EventWaitHandle)和条件变量(Monitor....

    多线程同步数据处理方法研究.pdf

    3. **Mutex对象同步多个对象**:Mutex是一种更强大的同步工具,它可以用来同步对多个对象的访问,防止多个线程同时访问共享资源。Mutex的WaitOne方法会让线程等待,直到获取到Mutex的所有权,ReleaseMutex则释放...

    java线程同步详解

    3. **只有共享变量(可变状态)才需要同步,常量或不可变对象可以并发访问。** 4. **同步可以应用于方法或代码块,根据需求选择合适的同步策略。** 5. **Java提供了`synchronized`关键字以及更高级的并发工具来实现...

    基于共享基础数据的信息系统集成方案

    综上所述,基于共享基础数据的信息系统集成方案是一条有效途径,它通过构建企业信息基础设施,解决了跨系统数据访问的难题,同时促进了企业信息化建设的深入发展。在实施过程中,需要注意整合遗留系统和新系统的平衡...

    RPC-DDSF:一种基于RPC的分布式数据共享框架.pdf

    分布式系统中的数据共享策略通常要求能够支持大规模的数据访问,同时保证数据的及时性和准确性。 总的来说,RPC-DDSF框架的提出为分布式系统的开发提供了一种新的思路和工具,它能够帮助开发者快速构建可配置、可...

    Java同步与异步[定义].pdf

    * asynchronized(异步的):不使用锁机制,允许多个线程同时访问共享资源。 * volatile(易变的):变量值可以被其他线程改变。 * atomic(原子的):操作不可被打断,能够保证数据的一致性。 * share(共享):多...

    世界最好的同步工具

    在IT行业中,文件同步是至关重要的任务,它允许用户在不同的设备或存储位置之间保持数据的一致性,确保重要文件的备份和访问便利。同步工具能够帮助我们自动检测并更新两个或多个目录之间的差异,使它们保持一致。 ...

    Matlab环境下基于Oracle的遥感数据存储访问优化研究.pdf

    传统上,非结构化数据管理系统如WinFS系统、Hadoop文件系统等,存在细粒度访问控制不足、元数据与内容维护不同步等问题,这些系统在数据安全性、共享性、类型多样性和管理性能等方面与实际需求存在一定差距。...

    行业分类-设备装置-多主媒体元数据同步化.zip

    它们通常提供APIs,使得与其他系统集成和同步元数据变得更加便捷。 4. **自动化工具**:开发自动化工具或脚本,定期扫描和比对不同设备或系统的元数据,发现并修正不一致之处。这可以通过编程语言如Python或...

Global site tag (gtag.js) - Google Analytics