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://geek.csdn.net/news/detail/243219
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
架构师之路-如何建立高可用消息中间件kafka
Kafka 一、熟悉kafka lServer-1 broker其实就是kafka的server,因为producer和consumer都要去连它。Broker主要还是做存储用。 lServer-2是zookeeper的server端,zookeeper的具体作用你可以去官网查,在这里你可以先想象,它维持了一张表,记录了各个节点的IP、端口等信息(以后还会讲到,它里面还存了kafka的相关信息)。 lServer-3、4、5他们的共同之处就是都配置了zkClient,更明确的说,就是运行前必须配置zookeeper的地址,道理也很简单,这之间的连接都是需要zookeeper来进行分发的。 lServer-1和Server-2的关系,他们可以放在一台机器上,也可以分开放,zookeeper也可以配集群。目的是防止某一台挂了。 简单说下整个系统运行的顺序: 1.启动zookeeper的server 2.启动kafka的server 3.Producer如果生产了数据,会先通过zookeeper找到broker,然后将数据存放进broker 4. Consumer如果要消费数据,会先通过zo...
- 下一篇
MySQL 表分区
MySQL表分区和分库分表一样,都是为了提高数据库的吞吐量。分区类似与分表,分表是逻辑上将一个大数据量的表分成多个,可以是水平分也可以是垂直分。而分区是将表的一个数据文件拆分成多个。不同的数据拆分到不同的文件中。这样对于一个数据量非常大的表,有多个数据文件来进行存储,这样就提高了数据库的 io 性能。 视频链接:http://www.roncoo.com/course/view/658088f6e77541f5835b61800314083e 既然是针对的数据表的文件进行操作,那么我们就需要先来了解 MySQL 表的存储。我们知道,MySQL 有多种存储引擎,不同的存储引擎所存储的文件格式不同。这里主要以 InnoDB 和 MyISAM 这两种存储引擎来说明。 InnoDB .frm 文件 数据表的结构 .idb 文件 表的数据文件,独享表空间,每个表有一个.idb 文件 .ibdata 文件 表的数据文件,共享表空间,所有的表使用这一个数据 文件 MyISAM .frm 文件 数据表的结构 .myd 文件 数据文件 .myi 文件 索引文件 首先要查看一下我们当前的数据库版本是...
相关文章
文章评论
共有0条评论来说两句吧...