做了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车的通道,就都不能通过,导致死锁。
饥饿:是指某个线程因为各种原因不能获取到所需要的资源,导致一直无法执行。比如线程的优先级过低,而高优先级的线程一直抢占它需要的资源。
比如:母鸟为食雏鸟,由于雏鸟很多,食物可能不够,雏鸟的竞争非常激烈,小雏鸟经常因为抢不到食物而被饿死
活锁:活锁是一种非常有趣的情况,就好像坐电梯,你坐电梯下楼电梯门开了,你准备出去,正好门外有人挡住了你的去路,他想进来,你很绅士的靠左避让对方,对方也很绅士靠右避让你,结果两人又撞上了。
如果是两个线程发生这种情况,相互谦让,主动将资源释放给其他人用,那么就会出现资源不断在两个线程中跳动,而没有一个线程可以同时拿到资源而正常执行,
并发的级别
由于临界区的出现,多线程的并发受必须受到控制,根据控制并发的策略,我们可以把并发的基本分类,大致上可以分为:阻塞,无饥饿,无障碍,无锁,无等待集中
无饥饿
如果线程之间是有优先级的,那么线程的调度总会倾向于优先级高的线程,也就是说对同一个资源的分配,是不公平的,
需要满足先来后到,那么就不会产生饥饿。
无障碍
如果两个线程是无障碍执行,那么他们不会因为临界区的问题导致一方挂起,也就是说,大家都可以进入临界区了,如果大家同时修改数据,把数据修改坏了怎么办?对于无障碍线程来说,一旦检测到这个情况,他就会立即对自己的修改进行回滚,确保数据的安全,如果没有发生数据进正,那么线程就会顺利完成工作,走出临界区。
无锁
无锁和并行都是无障碍的,在使用无锁的情况下,所有线程都能尝试访问临界区的内容,但是不同的是,无锁的并发,必然保证一个线程可以在有限步内离开临界区.
在无锁的情况下,一个典型的特点就是无限循环,在这个循环中,会不断尝试修改共享变量,如果没有冲突修改成功,那么程序退出,否则继续尝试修改,但是无论如何,无锁总能保证有一个线程修改成功.不至于全军覆没。
也有可能出现饥饿状态,如果运气不好一直尝试不成功。
无等待
无锁只要求一个线程可以在有限步内完成操作,而无等待,则是在无锁的基础上更进一步进行扩展,它要求所有线程必须在有限步内完成操作,这样就不会出现饥饿问题
哇塞好久没有打过中文了,感觉自己会出现很多错别字,加油!!!!!!!!!!!!给自己一点鼓励