多线程并发总结一 基础

平日主要是开发企业信息系统,所以使用到多线程的时候不多,但是相关的知识又很多很复杂,所以就在这里做一些总结吧。

我主要做Java为主,这里记录的会是很多跟Java相关,但是我想多线程的问题,很多又是相通的。

先说说多线程的难度吧,这个可以跟多线程相关问题形成的原因有关

  • 首先它是因为有共享的可变变量
  • 因为代码的执行顺序是可以在编译或执行时优化的,所以以为已经执行的代码,其实还没有执行

通过各种锁的机制可以解决并发问题,但是又有以下的情况需要注意的

  • 如果同步的范围太大,那么并发带来的性能提升将不存在
  • 如果同步范围缩小,容易因为没有覆盖全需要覆盖的代码而引进Bug
  • 如果有多个锁需要获取,且获取锁的顺序在不同的代码段不是一致的,那么就可能引起死锁。
  • 另外,还有其他的一些相关的问题就是活锁,饿死和阻塞。

所以加锁需要加的范围刚刚好,且多个锁的获取顺序必须一致来避免加锁。

举几个Java的例子,比较容易出错的。

int a=0;

public void increase() {
    a++
}

这块代码并不满足原子性,所以当有多个1000个线程运行上面的代码之后,我们得到的结果并不一定等于1000.

换一下,变成下面的样子

volatile int a = 0;

public void increase() {
    a++;
}
<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值