java多线程并发(初级)(理论篇)

做了4年的web开发,对java这门语言感觉自己还是没有说的那么深入,用到的东西都很皮毛,做项目是都很依赖网络,每学习一个框架都没有系统的去总结,使用完后,过一段时间就忘记了框架的基本,只有模糊的概念,都是自己没有系统的去总结自己学习的知识,和记录自己学到的东西。看网上说大牛都是通过写博客记录自己的点滴来累计,几年下来学到的东西 ,积累的东西,真的在工作中,和发展中都起到了很大的作用。这次看了 郭超  编写的《java高并发程序设计》做一个知识点的总结 也是书本知识点的概括。

 

java同步(synchronous)和异步(AsSynchronous)

同步和异步通常用来形容一次方法的调用,

同步方法是:调用一旦开始,调用者就需要等待方法调用返回(结束),才能继续后续的行为.

异步方法更像是消息传递,一旦方法调用就会立刻返回,调用者就可以继续后续操作(类似于前端的ajax异步渲染,不会妨碍页面整个页面加载),

同步举例子:比如我们去购物,去商店买,电视机,当你看中一台电视机,就去找售货员下单,售货员去残酷帮你调货,天气热的遭不住,你就崔商家快一点,于是你就在商店等着,知道商家把你和电视一起送回家

异步:比如在家里打开电脑,在网上订购一台电视机,当你支付完成时,对你来说整个过程已经结束,虽然空调没到家,但是你的任务已经完成,商家接到订单会加紧安排送货。当然这一切与你无关,你支付已经完成 先去哪就去哪。

JAVA(concurrency)并发和并行(perallelism)

并发和并行是很容易搞混淆的概念,他们都可以表示多个任务一起执行,但是偏重点不一样.

并发:是多个任务交替执行  比如:--->A--->B-->A---->B,严格来说并发的整个过程是交替执行的,不是并发,多个任务同时执行

并行:是多个任务同时执行(考虑到cpu的核数):

-------->A
|-------->B

平行线执行。

 临界区

临界区用来表示一种公共资源,可以说是共享数据,可以被多个线程访问,但是每一次,只用一个线程能使用它,一旦临界区的资源被使用,其他线程想要使用这个资源,就必须等待。

比如一个办公室只有一台打印机,打印机一次只能执行一个任务,如果小王和小明要同时需要打印文件,显然只有一个先打印另一个处于等待状态.

阻塞(Blocking)和非阻塞(Non-Blocking)

阻塞和非阻塞通常用来形容多线程之间的相互影响。

比如一个线程,占用了临界区的资源,其他线程要访问这个资源就必须在临界区中进行等待,这个过程叫阻塞

非阻塞的意思恰恰相反:它没有强调一个线程可以妨碍到另外一个线程的调用,所有线程都会尝试不断向前执行。

 

死锁(Deadlock).饥饿(starvation)活锁(LiveLock)

死锁饥饿活锁都是属于线程的活跃问题。如果发现以上几种情况,那么线程可能就不再活跃。

死锁:比如有3辆车,A,B,C,   A占用了B车的通道,B车占用了C车的通道,C车占用了A车的通道,就都不能通过,导致死锁。

饥饿:是指某个线程因为各种原因不能获取到所需要的资源,导致一直无法执行。比如线程的优先级过低,而高优先级的线程一直抢占它需要的资源。

比如:母鸟为食雏鸟,由于雏鸟很多,食物可能不够,雏鸟的竞争非常激烈,小雏鸟经常因为抢不到食物而被饿死

活锁:活锁是一种非常有趣的情况,就好像坐电梯,你坐电梯下楼电梯门开了,你准备出去,正好门外有人挡住了你的去路,他想进来,你很绅士的靠左避让对方,对方也很绅士靠右避让你,结果两人又撞上了。

如果是两个线程发生这种情况,相互谦让,主动将资源释放给其他人用,那么就会出现资源不断在两个线程中跳动,而没有一个线程可以同时拿到资源而正常执行,

 

并发的级别

由于临界区的出现,多线程的并发受必须受到控制,根据控制并发的策略,我们可以把并发的基本分类,大致上可以分为:阻塞,无饥饿,无障碍,无锁,无等待集中

 无饥饿

如果线程之间是有优先级的,那么线程的调度总会倾向于优先级高的线程,也就是说对同一个资源的分配,是不公平的,

需要满足先来后到,那么就不会产生饥饿。

无障碍

如果两个线程是无障碍执行,那么他们不会因为临界区的问题导致一方挂起,也就是说,大家都可以进入临界区了,如果大家同时修改数据,把数据修改坏了怎么办?对于无障碍线程来说,一旦检测到这个情况,他就会立即对自己的修改进行回滚,确保数据的安全,如果没有发生数据进正,那么线程就会顺利完成工作,走出临界区。

无锁

无锁和并行都是无障碍的,在使用无锁的情况下,所有线程都能尝试访问临界区的内容,但是不同的是,无锁的并发,必然保证一个线程可以在有限步内离开临界区.

在无锁的情况下,一个典型的特点就是无限循环,在这个循环中,会不断尝试修改共享变量,如果没有冲突修改成功,那么程序退出,否则继续尝试修改,但是无论如何,无锁总能保证有一个线程修改成功.不至于全军覆没。

也有可能出现饥饿状态,如果运气不好一直尝试不成功。

无等待

无锁只要求一个线程可以在有限步内完成操作,而无等待,则是在无锁的基础上更进一步进行扩展,它要求所有线程必须在有限步内完成操作,这样就不会出现饥饿问题

 

哇塞好久没有打过中文了,感觉自己会出现很多错别字,加油!!!!!!!!!!!!给自己一点鼓励

 

 

                                                                

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值