`

在其他对象上同步

 
阅读更多

      synchronized块必须给定一个在其上进行同步的对象,最合理的方式是:使用其方法正在被调用的当前方法:synchronized(this)。

      但是有的时候必须在另一个对象上同步。

      我们看两个代码的例子:

                                                                                 1.

package com.wjy.test;


public class Dualsynch{
	private Object myObject=new Object();
	public synchronized void f(){
		for(int i=0;i<10;i++){
			System.out.println("I am f function.");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public void g(){
		synchronized (this) {
			for(int i=0;i<10;i++){
				System.out.println("I am g function.");
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

 测试代码:

 

 

package com.wjy.test;

public class TestMain {
	public static void main(String args[]) {
		final Dualsynch dualsynch=new Dualsynch();
		new Thread(){
			public void run(){
				dualsynch.f();
			}
		}.start();
		
		dualsynch.g();
	}
}

 运行结果:

 

I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am g function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.
I am f function.

 很明显,进程发生了阻塞。但是修改代码synchronized(this)中的this后,救国救民不同了,因为两个函数(f 和  g)是在不同对象上同步的。

                                                                     2

package com.wjy.test;


public class Dualsynch{
	private Object myObject=new Object();
	public synchronized void f(){
		for(int i=0;i<10;i++){
			System.out.println("I am f function.");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public void g(){
		synchronized (myObject) {
			for(int i=0;i<10;i++){
				System.out.println("I am g function.");
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

 测试代码没有变,看看结果:

I am g function.
I am f function.
I am f function.
I am g function.
I am f function.
I am g function.
I am g function.
I am f function.
I am f function.
I am g function.
I am g function.
I am f function.
I am g function.
I am f function.
I am g function.
I am f function.
I am f function.
I am g function.
I am f function.
I am g function.

 

分享到:
评论

相关推荐

    线程与内核对象的同步

    总之,线程与内核对象的同步是Windows编程中不可或缺的一部分,通过合理利用内核对象,开发者可以构建出高效、稳定的多线程程序,确保在高并发环境下的正确性和性能。虽然内核方式的同步可能会带来一定的性能开销,...

    多线程同步.(同步对象的用法)doc

    总结来说,多线程同步是通过各种内核对象和同步原语来实现的,它们提供了在并发环境中保护共享资源的机制。不同的同步方法适用于不同的情景,开发者需要根据实际需求选择合适的方法,以保证程序的正确性和性能。在...

    如何使用事件对象同步进程

    在多线程编程中,进程同步是一个至关重要的概念,它确保了多个进程或线程之间的协同工作,防止数据不一致性...在实际项目中,结合其他同步机制如互斥量、信号量等,可以构建出更为复杂的同步策略,满足不同的并发需求。

    使用CEvent对象实现线程同步

    在多线程编程中,线程同步是一种关键的技术,它确保了多个线程在访问...在实际项目中,结合其他MFC同步对象如CSemaphore(信号量)、CCriticalSection(临界区)等,可以构建出更复杂的同步策略,以应对各种并发问题。

    [Android][同一对象不同实例同步操作一个目标]

    在Android开发中,多线程同步是一个至关重要的概念,特别是在处理UI更新、网络请求或者其他并发操作时。当多个线程尝试同时访问和修改同一对象时,如果没有适当的同步机制,可能会导致数据不一致、程序崩溃等问题。...

    winform 使用当前对象同步源码

    在Windows Forms(Winform)开发中,"当前对象同步"是指多线程环境下,如何确保对共享资源的访问是安全的。在标题和描述中提到的"winform 使用当前对象同步源码",指的是在Winform应用程序中实现线程同步的代码示例...

    使用互斥对象(Mutex)实现线程同步

    互斥对象(Mutex)是实现线程同步的一种常见机制,尤其在MFC(Microsoft Foundation Classes)库中有着广泛的应用。本文将详细探讨如何在MFC工程中使用Mutex来实现线程同步。 1. **互斥对象(Mutex)基础** - 互斥...

    线程同步对象方法

    在选择线程同步对象时,应根据具体需求来决定。例如,如果你需要确保一个资源只能被一个线程访问,Mutex或lock可能是最佳选择。如果需要控制读写操作,ReaderWriterLock则更合适。在使用线程同步时,需要注意其可能...

    9线程和内核对象的同步[参照].pdf

    此外,Windows还提供了其他高级同步机制,如信号量(Semaphore)和可等待定时器(Waitable Timer),它们可以控制同时访问资源的线程数量,或者在指定时间后唤醒线程。这些工具的组合使用可以构建复杂、健壮的多线程...

    windows笔记-【内核对象线程同步】事件内核对象[借鉴].pdf

    在Windows操作系统中,内核对象是系统用于进程和线程同步的重要工具,而事件内核对象是其中的基础类型之一。事件对象主要用于在一个线程完成特定操作后,通知其他线程可以继续执行。本文将深入探讨事件内核对象的...

    线程同步的理解

    当在静态方法前使用`synchronized`关键字,或者同步一个类的静态变量,如`synchronized static void f1()`,实际上是锁定该类的Class对象。这与对象实例锁不同,因为它影响的是所有该类的实例。所有线程在调用此类...

    使用互斥对象(Mutex)实现不同进程间线程同步

    首先,你需要声明一个`std::mutex`对象,然后在需要同步的代码块周围使用`lock()`和`unlock()`函数来锁定和解锁Mutex。例如: ```cpp std::mutex mtx; void thread_function() { mtx.lock(); // 临界区:在...

    3种多线程实现同步方法

    在设计多线程程序时,不仅要考虑同步问题,还要注意减少线程间的上下文切换,避免死锁和饥饿现象,确保程序的健壮性和可维护性。在分析和调试多线程程序时,使用线程调试器或日志记录工具也会有所帮助,以便找出潜在...

    静态方法同步 与 非静态方法同步

    这意味着所有实例共享同一个锁,不论创建了多少个对象,所有线程在调用静态同步方法时都会争夺这个单一的锁。这样的同步机制适用于需要全局保护的资源或状态。 例如,在`SynchronizedTest.java`中可能会有以下静态...

    java synchronize 线程同步

    如果多个线程尝试同时调用同一个对象的同步方法,那么只有一个线程能够获取到对象的锁并执行方法,其他线程则需要等待锁的释放。 在例子中,`execute()`方法没有被`synchronized`修饰时,两个线程并发调用同一个...

    易语言窗口同步操作源码

    互斥量是一种独占型同步对象,当一个线程获取了互斥量后,其他试图获取的线程将会被阻塞,直到拥有互斥量的线程释放它。这样,可以确保在任何时刻只有一个窗口能够访问共享数据。 此外,标签“独立团论坛-从零开始...

    使用临界区对象(CriticalSeciton)实现线程同步

    在Windows API中,临界区对象(CriticalSection)是实现线程同步的一种机制,特别适用于单进程内的线程间同步。本文将深入探讨临界区对象的原理、使用方法及其在MFC工程中的应用。 1. **临界区对象(Critical...

    云存储中的对象存储数据同步方法研究.doc

    Swift 采用复制策略来实现数据同步,每个对象都有多个副本分布在不同的节点上。通过一致性哈希算法,Swift 可以在节点间高效地分配和更新数据。为了保持数据一致性,Swift 实现了多种同步机制,如延迟写入、幂等性...

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

    在 Java 中,还有其他线程同步机制,如volatile 变量、Atomic 变量、Lock 接口等。这些机制可以用于解决不同类型的线程同步问题。 线程同步机制的选择取决于具体的应用场景和需求。开发者需要根据实际情况选择合适...

Global site tag (gtag.js) - Google Analytics