专栏首页李鹏的专栏JAVA 高并发设计
原创

JAVA 高并发设计

一、同步(Synchronous)和异步(Asynchronous)

同步和异步通常用来形容一次方法调用,同步方法,调用者必须等到方法调用返回后,才能继续后续的行为,异步方法调用会立即返回,调用者就可以继续后续的操作

二、并发和并行

并发和并行都可以表示两个或多个任务一起执行,但偏重点点不同,并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。而并行是真正意义上的“同时执行”。

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

一个线程占用了临界资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起,这种情况就是阻塞,非阻塞的意思与之相反。

四、线程的状态

线程的状态

1、线程的启动是调用start()方法,而不是run()方法。

2、线程的终止、不用stop()是因为stop()方法太过暴力,强行把执行到一半的线程终止,可能会引起数据不一致的问题,一般我们定义一个线程终止的方法,告知线程何时停止即可。

3、线程中断:线程中断并不会使线程立即退出,而是给线程发一个通知,告知目标线程,有人希望你退出,至于目标线程接到通知后如何处理,则完全由目标线程自行决定。与线程中断的有三个方法

Thread.interrupt(): // 中断线程

Thread.isInterrupted()://判断是否中断

Thread.Interrupted():// 判断是否中断,并清除当前中断状态

注:Thread.sleep()方法会抛出一个InterruptedException中断异常,这不是运行时异常,也就是说程序必须捕获并处理它。当线程在休眠时,如果被中断,这个异常会产生。

4、等待(wait)和通知(notify) 注:这两个方法是在Object类中的,意味着任何对象都可以调用这两个方法。

obj.wait()方法,线程会停止继续执行,转为等待状态,直到其他线程调用obj.notify()方法为止。调用object.wait()方法,就会进入object对象的等待队列,当调用object.notify()时,会从这个等待队列中,随机选择一个线程,并将其唤醒,这个选择是不公平的,完全是随机的。notifyAll()会唤醒等待队列里的所有线程,而不是随机选择一个线程。

5、挂起(suspend)和继续执行(resume)线程

suspend与resume是一组相反的操作,调用suspend方法后的线程,必须等到resume方法调用后,才能继续执行。

注:此方法已经被废弃,并不推荐使用,因为suspend()在导致线程暂停的同时,并不会去释放任何资源。此 时,若其他任何线程想要访问被它暂用的锁时,都会被牵连,导致无法正常继续运行。同时,若resume()方法在suspend()前就执行了,那么被suspend()方法挂起的线程,很难有机会被继续执行,更为严重的是,它所占用的锁不会被释放,可能导致整个系统工作不正常。同时,对于被挂起的线程,从线程状态上看,还是Runnable,会严重影响我们的判断.

原文链接:http://www.roncoo.com/article/detail/130836

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 虚拟机的内存结构

    我们都知道虚拟机的内存划分了多个区域,并不是一张大饼。那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快。

    李鹏
  • 深度解剖dubbo源码

    -----------学习dubbo源码,能给你带来什么好处?-----------

    李鹏
  • Linux下搭建MySQL集群

    最近工作上接到任务,需要研究学习下 MySQL 集群。作为一个新手,没有搭建过 MySQL 集群,参阅了不少别人的文章后,成功搭建!在此记录下,方便以后查阅!

    李鹏
  • Java基础--线程创建方式

    线程的创建主要有两种形式,通过继承Thread或者实现Runnable接口,本质上没有太大区别。

    河岸飞流
  • 多线程?怎么用?

    进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

    故里
  • 读书笔记《Java并发编程的艺术 - 方腾飞》- Java并发编程

    在Java中, 我们可以通过 priority 属性来设置线程的优先级, 参数为 1 ~ 10 参数越大, 代表优先级越高, 默认的优先级为 5

    lvgo
  • 多线程开发,先学会线程池吧

    在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable()...

    java技术爱好者
  • 并发编程面试题汇总

    thinkwon.blog.csdn.net/article/details/104863992

    Java旅途
  • Thread方法

    这个方法返回线程的 ID 值,类型为 long。线程的 ID 在线程的整个生命周期中都不变。

    宇宙之一粟
  • 线程

    并发编程在开发一般的项目确实接触很少,也导致平时学习的机会也不多,基本上都是碰到相关问题时会查一些相关资料去解决,所以很少会对这本分知识有系统和全面的了解。虽说...

    胖虎

扫码关注云+社区

领取腾讯云代金券