C#与JAVA线程间同步实现比较

简介:

    C#与JAVA二者是对标下的产物,无论设计思想还是语法格式都非常相似,相恨相杀一路走来各自拥有一群拥趸,思想理念都传承自面向对象的C++,不过要说血缘关系还是C#更近一些,保留了比较多的C++的影子让人多了几分熟悉的味道,IDE上VS也比MyEclipse用户体验好很多,不用idea去比明显偏心眼VS,好吧你说对了。

    C#和C++都提供了良好完备的线程间同步机制,C#保留了更多的C++烙印,JAVA则干练的多让开发者省心不少。过去在面向过程的编程思路上,锁的操作基本都是基于语句的,锁的范围从加锁开始到解锁终止,代码编写的过程中各种小心锁区间的逻辑处理,一个异常就可能导致万劫不复的死锁。C#和JAVA把更多面向底层的锁操作封装起来,通过赋予对象实例一个修饰词的方法,极大的简化了步骤,当然也可以对语句块加锁,省略了显式的繁琐操作。


C# JAVA C++
获取

Monitor.Enter(object);

Monitor.TryEnter(object);


休眠 Monitor.Wait(object); final void wait();

pthread_cond_wait(_cond, _mutex);

pthread_cond_timewait(_cond, _mutex, _abstime);
唤醒

Monitor.Pulse(object);

Monitor.PulseAll(object);

final void notify();

final void notifyAll();

pthread_cond_signal(_cond);

pthread_cond_broadcast (_cond);
释放 Monitor.Exit(object);

    上表显示了C#和JAVA语言基于监视器的同步方法的函数,C#比JAVA多了对监视器的获取和释放操作,二者都提供休眠等待时间,唤醒操作都提供单播和多播两种方式,在明确被唤醒对象且预知其执行方法及结果的前提下建议单播方式唤醒,否则多播唤醒后再逐个投入睡眠导致的惊群上下文切换会造成比较大的系统开销。需要特别注意的地方是按照甲骨文的推荐把wait()方法放到一个循环中可以有效避免假唤醒(spurious wakeup)情况的发生,虽然Oralce强调这种情况发生的概率极小,其实意思是说:我可告诉你,不听是你的事情,出了问题别找我。表中用C++做陪衬说明是为了更好的比较这种机制的适用场景,那就是并不是简单的粗暴加锁解锁,而是有条件有尺度的以最小开销获取独占操作。

public void CSharpFunc(int v)
{
	Monitor.Enter(this);
	if (flag)
	{
		try
		{
			Monitor.Wait(this);
		}
		catch(SynchironizationLockException e)
		{
			Console.WriteLine(e);
		}
	}
	Console.Write("Value {0}", v);
	flag = true;
	Monitor.Pulse(this);
	Monitor.Exit(this);
}

synchronized void JavaFunc(int v) {
	while (!flag)
		try {
			wait();
		} catch(InterruptedException e) {
			System.out.println("InterruptedException caught");
		}
	System.out.println("Valuse: " + v);
	flag = false;
	notify();
}

    前几天出门体验了一次7号共享电单车,以为无桩的可以为所欲为骑行,结果冲了押金又充值,扫码开锁竟然要指定目的地,因为目的地周边没有停车场,只好骑到地铁站再换乘,这叫啥事呀,账上趴着充值剩余的金额,提不出来也不知道下次啥时候消费,有种上当受骗的感觉,有桩的共享出行交通工具都是反人类设计,改改吧。

相关文章
|
9天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
80 38
|
6天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
10天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
26 1
[Java]线程生命周期与线程通信
|
1天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
12 4
|
1天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
19 3
|
8天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
2天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
12 1
|
6天前
|
缓存 Java 调度
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文旨在为读者提供一个关于Java多线程编程的全面指南。我们将从多线程的基本概念开始,逐步深入到Java中实现多线程的方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。此外,我们还将探讨多线程编程中的常见问题和最佳实践,帮助读者在实际项目中更好地应用多线程技术。
15 3
|
8天前
|
监控 安全 Java
Java多线程编程的艺术与实践
【10月更文挑战第22天】 在现代软件开发中,多线程编程是一项不可或缺的技能。本文将深入探讨Java多线程编程的核心概念、常见问题以及最佳实践,帮助开发者掌握这一强大的工具。我们将从基础概念入手,逐步深入到高级主题,包括线程的创建与管理、同步机制、线程池的使用等。通过实际案例分析,本文旨在提供一种系统化的学习方法,使读者能够在实际项目中灵活运用多线程技术。
|
6天前
|
缓存 安全 Java
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文将深入探讨Java中的多线程编程,包括其基本原理、实现方式以及常见问题。我们将从简单的线程创建开始,逐步深入了解线程的生命周期、同步机制、并发工具类等高级主题。通过实际案例和代码示例,帮助读者掌握多线程编程的核心概念和技术,提高程序的性能和可靠性。
10 2