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.
相关推荐
7. **线程同步对象速查表**和**其他的线程同步函数**:这部分提供了快速参考,总结了各种内核对象的特性,并介绍了一些额外的同步函数,如CreateMutex、CreateSemaphore等,帮助开发者选择最合适的同步策略。...
总之,线程与内核对象的同步是Windows编程中不可或缺的一部分,通过合理利用内核对象,开发者可以构建出高效、稳定的多线程程序,确保在高并发环境下的正确性和性能。虽然内核方式的同步可能会带来一定的性能开销,...
总结来说,多线程同步是通过各种内核对象和同步原语来实现的,它们提供了在并发环境中保护共享资源的机制。不同的同步方法适用于不同的情景,开发者需要根据实际需求选择合适的方法,以保证程序的正确性和性能。在...
在多线程编程中,进程同步是一个至关重要的概念,它确保了多个进程或线程之间的协同工作,防止数据不一致性...在实际项目中,结合其他同步机制如互斥量、信号量等,可以构建出更为复杂的同步策略,满足不同的并发需求。
在多线程编程中,线程同步是一种关键的技术,它确保了多个线程在访问...在实际项目中,结合其他MFC同步对象如CSemaphore(信号量)、CCriticalSection(临界区)等,可以构建出更复杂的同步策略,以应对各种并发问题。
在Android开发中,多线程同步是一个至关重要的概念,特别是在处理UI更新、网络请求或者其他并发操作时。当多个线程尝试同时访问和修改同一对象时,如果没有适当的同步机制,可能会导致数据不一致、程序崩溃等问题。...
在Windows Forms(Winform)开发中,"当前对象同步"是指多线程环境下,如何确保对共享资源的访问是安全的。在标题和描述中提到的"winform 使用当前对象同步源码",指的是在Winform应用程序中实现线程同步的代码示例...
互斥对象(Mutex)是实现线程同步的一种常见机制,尤其在MFC(Microsoft Foundation Classes)库中有着广泛的应用。本文将详细探讨如何在MFC工程中使用Mutex来实现线程同步。 1. **互斥对象(Mutex)基础** - 互斥...
在选择线程同步对象时,应根据具体需求来决定。例如,如果你需要确保一个资源只能被一个线程访问,Mutex或lock可能是最佳选择。如果需要控制读写操作,ReaderWriterLock则更合适。在使用线程同步时,需要注意其可能...
此外,Windows还提供了其他高级同步机制,如信号量(Semaphore)和可等待定时器(Waitable Timer),它们可以控制同时访问资源的线程数量,或者在指定时间后唤醒线程。这些工具的组合使用可以构建复杂、健壮的多线程...
在Windows操作系统中,内核对象是系统用于进程和线程同步的重要工具,而事件内核对象是其中的基础类型之一。事件对象主要用于在一个线程完成特定操作后,通知其他线程可以继续执行。本文将深入探讨事件内核对象的...
当在静态方法前使用`synchronized`关键字,或者同步一个类的静态变量,如`synchronized static void f1()`,实际上是锁定该类的Class对象。这与对象实例锁不同,因为它影响的是所有该类的实例。所有线程在调用此类...
首先,你需要声明一个`std::mutex`对象,然后在需要同步的代码块周围使用`lock()`和`unlock()`函数来锁定和解锁Mutex。例如: ```cpp std::mutex mtx; void thread_function() { mtx.lock(); // 临界区:在...
在设计多线程程序时,不仅要考虑同步问题,还要注意减少线程间的上下文切换,避免死锁和饥饿现象,确保程序的健壮性和可维护性。在分析和调试多线程程序时,使用线程调试器或日志记录工具也会有所帮助,以便找出潜在...
这意味着所有实例共享同一个锁,不论创建了多少个对象,所有线程在调用静态同步方法时都会争夺这个单一的锁。这样的同步机制适用于需要全局保护的资源或状态。 例如,在`SynchronizedTest.java`中可能会有以下静态...
如果多个线程尝试同时调用同一个对象的同步方法,那么只有一个线程能够获取到对象的锁并执行方法,其他线程则需要等待锁的释放。 在例子中,`execute()`方法没有被`synchronized`修饰时,两个线程并发调用同一个...
互斥量是一种独占型同步对象,当一个线程获取了互斥量后,其他试图获取的线程将会被阻塞,直到拥有互斥量的线程释放它。这样,可以确保在任何时刻只有一个窗口能够访问共享数据。 此外,标签“独立团论坛-从零开始...
在Windows API中,临界区对象(CriticalSection)是实现线程同步的一种机制,特别适用于单进程内的线程间同步。本文将深入探讨临界区对象的原理、使用方法及其在MFC工程中的应用。 1. **临界区对象(Critical...
Swift 采用复制策略来实现数据同步,每个对象都有多个副本分布在不同的节点上。通过一致性哈希算法,Swift 可以在节点间高效地分配和更新数据。为了保持数据一致性,Swift 实现了多种同步机制,如延迟写入、幂等性...
在 Java 中,还有其他线程同步机制,如volatile 变量、Atomic 变量、Lock 接口等。这些机制可以用于解决不同类型的线程同步问题。 线程同步机制的选择取决于具体的应用场景和需求。开发者需要根据实际情况选择合适...