并发程序开发及优化之不变模式

 在并行软件开发过程中,同步操作似乎是必不可少的。当多线程对同一个对象进行读写操作时,为了保证对象数据的一致性和正确性,有必要对对象进行同步。而同步操作对系统性能有相当的损耗。为了尽可能的去除这些同步操作,提高并行程序性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然保持内部状态的一致性和正确性。这就是不变模式。

不变模式天生就是多线程友好的,它的核心思想是,一个对象一旦被创建,则它的内部状态将永远不会发生改变。所以,没有一个线程可以修改其内部状态和数据,同时其内部状态也绝不会自行发生改变。基于这些特性,对不变对象的多线程操作不需要进行同步控制。

同时还需要注意,不变模式和只读属性是有一定的区别的。不变模式比只读属性具有更强的一致性和不变性。对只读属性的对象而言,对象本身不能被其他线程修改,但是对象的自身状态却可能自行修改。

比如,一个对象的存活时间(对象创建时间和当前时间的时间差)是只读的,因为任何一个第三方线程都不能修改这个属性,但是这是一个可变的属性,因为随着时间的推移,存活时间时刻都在发生变化。而不变模式则要求,无论出于什么原因,对象自创建后,其内部状态和数据保持绝对的稳定。

综上所述,不变模式的主要使用场景主要需要满足以下两个条件:

当对象创建后,其内部状态和数据不再发生任何变化。

对象需要被共享、被多线程频繁访问。

在Java语言中,不变模式的实现很简单。为确保对象被创建后,不发生任何改变,并保证不变模式正常工作,只需要注意以下4点:

去除setter方法以及所有修改自身属性的方法。

将所有属性设置为私有,并用final标记,确保其不可修改。

确保没有子类可以重载修改它的行为。

有一个可以创建完整对象的构造函数。

package com.turing.currency.model.immutable;

public final class Product {	//确保无子类
	private final String no;	//私有属性,不会被其他对象获取	
	private final String name;	//final保证属性不会被2次赋值
	private final double price;

	public Product(String no, String name, double price) {
		//在创建对象时,必须指定数据,因为创建之后,无法进行修改
		super();
		this.no = no;
		this.name = name;
		this.price = price;
	}

	public String getNo() {
		return no;
	}

	public String getName() {
		return name;
	}

	public double getPrice() {
		return price;
	}

}

在不变模式的实现中,final关键字起到了重要的作用。对class的final定义保证了不变类没有子类,确保其所有的getter行为不会被修改。对属性的final定义确保所有数据只能在对象被构造时赋值一次。之后,就永远不再发生改变。

在JDK中,不变模式的应用非常广泛。其中,最为典型的就是java.lang.String类。此外,所有的元数据类包装类,都是使用不变模式实现的。主要的不变模式类型如下:

java.lang.String

java.lang.Boolean

java.lang.Byte

java.lang.Character

java.lang.Double

java.lang.Float

java.lang.Integer

java.lang.Long

java.lang.Short

由于基本数据类型和String类型在实际的软件开发中应用极其广泛,使用不变模式后,所有实例的方法均不需要进行同步操作,保证了它们在多线程环境下的性能。

注意:

不变模式通过回避问题而不是解决问题的态度来处理多线程并发访问控制。不变对象是不需要进行同步操作的。由于并发同步会对性能产生不良的影响,因此,在需求允许的情况下,不变模式可以提高系统的并发性和并发量。
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嵌入式软件开发的CPU性能优化涉及到多核高并发的问题。随着科技的进步和嵌入式系统的不断发展,单核处理能力已经无法满足需求,因此多核技术应运而生。 多核技术指的是将多个CPU核心集成到一个芯片上,每个核心都可以独立地执行任务。通过将任务分配给不同的核心并发执行,可以提升系统的整体性能。在嵌入式软件开发中,利用多核技术进行性能优化主要有以下几个方面。 首先是任务划分和并行化。将系统中的任务划分为不同的子任务,并分配给不同的核心进行执行。通过合理的任务分配和并行化设计,可以最大程度地利用多核处理器的计算能力。 其次是任务调度和同步。在多核系统中,不同的核心可能要同时访问共享资源,因此需要进行任务调度和同步。通过合理的调度策略和同步机制,可以避免资源冲突和竞争状况,提高并发执行的效率。 另外,还可以采用并行算法和数据结构。在嵌入式软件开发中,选择适合并行执行的算法和数据结构,可以进一步提高多核处理器的性能。例如,可以采用并行搜索算法、并行排序算法等,以及适合多核并发访问的数据结构,如并发队列、并发哈希表等。 此外,还可以通过优化指令和数据流,减少数据的移动和拷贝操作。多核处理器的性能瓶颈之一是数据在不同核心之间的传输和拷贝。通过优化指令和数据流,可以尽量减少数据的移动和拷贝操作,提高多核处理器的数据访问效率。 综上所述,嵌入式软件开发的CPU性能优化多核高并发可以通过任务划分和并行化、任务调度和同步、并行算法和数据结构、优化指令和数据流等方式来实现。这些技术的应用可以提高系统的整体性能,适应日益复杂和高并发的嵌入式应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芸复山人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值