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架构师

C# 多线程

 Thread类的使用: 初始化: Thread th1 = new Thread(function1); Thread th2 = new Thread(ne...

3136
来自专栏desperate633

Java并发之“饥饿”和“公平锁”(Starvation and Fairness)java中发生线程饥饿的原因java中实现公平锁公平锁性能考虑

如果一个线程的cpu执行时间都被其他线程抢占了,导致得不到cpu执行,这种情况就叫做“饥饿”,这个线程就会出现饥饿致死的现象,因为永远无法得到cpu的执行。解决...

521
来自专栏Java 源码分析

Java多线程

1.复写run方法的目的在于,把要运行的代码放到run方法里面,也就是新的线程要跑什么内容 这也就是第一种多线程的方法,其主要的步骤如下: 继承Thread类 ...

2804
来自专栏老马说编程

(81) 并发同步协作工具 / 计算机程序的思维逻辑

查看历史文章,请点击上方链接关注公众号。 我们在67节和68节实现了线程的一些基本协作机制,那是利用基本的wait/notify实现的,我们提到,Java并发包...

1829
来自专栏hrscy

iOS 多线程--NSThread

比如售票问题,同一张票在某个时间只能卖给一个人,不能把一张票卖给多个人,这样就会出问题。

682
来自专栏微服务那些事儿

java多线程(一)快速认识线程

答:继承Thread类,实现Runnable接口,为了展示自己学识的渊博,还可能还会说实现Callable接口通过FutureTask包装器来创建Thread线...

1274
来自专栏小灰灰

Java并发学习之线程状态及Thread常用方法详解

线程状态及Thread常用方法详解 I. 线程状态 在前面线程创建的一篇博文中,明确说明只有在调用 Thread#start()方法之后,线程才会启动;那线程...

1857
来自专栏专注 Java 基础分享

线程的基本概念

按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业...

762
来自专栏javathings

Java 线程状态有哪些?

1. 线程 start 方法执行后,并不表示该线程运行了,而是进入就绪状态,意思是随时准备运行,但是真正何时运行,是由操作系统决定的,代码并不能控制,

963
来自专栏desperate633

Java多线程之死锁(Deadlock)及死锁避免(Deadlock Prevention)线程死锁(Thread Deadlock)更复杂的死锁情况数据库死锁死锁避免(Deadlock Preven

死锁就是当两个或者多个线程阻塞了 ,正在等到所需要的锁,但这些锁被其他也在等待的线程锁持有。死锁常常发生在多个线程在同一个时刻,需要同一些锁,但是他们获取锁的顺...

511

扫码关注云+社区