软件构造 线程与进程

进程
→正在运行的一个程序的实例
→虚拟计算机
→有私有专用的内存空间,不共享内存;
→通过消息传递交流信息(标准IO流)

线程
→正在运行的执行路径
→虚拟处理器(轻量级进程)
→线程在进程内,互相之间共享资源
→特殊处理才能实现消息传递、访问私有内存
→每个应用程序至少有一个线程,main线程是开始线程,可以通过它创建其他的线程

在某时刻,一个运行核心上只有一个线程可以运行
进程 / 线程等采用OS提供的时间片机制共享处理时间
当线程数多于处理器数量时,并发通过时间片来模拟,处理器切换处理不同的线程

共享内存时,由于底层指令存在交叉,很容易出现错误

竞争条件:程序的正确性(后置条件和不变性的满足),取决于并发计算A和B中事件的相对时间
在有些情况下会导致违反后置条件和不变性
对于这种情况,调整代码起不到什么作用。不能仅仅从Java代码中看出处理器将如何执行它,本质原因是它们不是原子操作
银行账户的这个例子中的竞争情况,可以用顺序操作在不同处理器上的不同交叉执行解释,但是事实上,当使用多个变量和多个处理器时,甚至不能指望这些变量的变化以相同的顺序出现

线程安全的四种方式
(1)限制可变变量的共享,避免使用全局变量
通过将数据限制在单个线程中,可以避免线程在可变数据上进行竞争;
局部变量保存在线程栈中,每个调用都有自己的变量副本;
局部变量如果是对象的引用,则要确保不能引用任何其他线程可访问的对象(针对可变对象)

全局静态变量不会自动受到线程访问限制;如果使用了全局静态变量,则应说明只允许一个线程使用它们;
在多线程环境中,取消全局变量;
一般来说,静态变量对于并行是非常危险的,它们可能隐藏在似乎没有副作用或改变的无害功能之后。

(2)用不可变的共享变量
不可变解决了因为共享可变数据造成的竞争,并简单地通过使共享数据不可变来解决。
final变量不允许再赋值,所以声明为final的变量可以安全地从多个线程访问;
由于这种安全性只适用于变量本身,仍然必须确保变量指向的对象是不可变的

不可变性的强定义
没有改变数据的操作
所有的字段均为private 和 final
没有表示泄露
表示中的任何可变对象都不能变化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值