多线程
pocher
Your thought is the parent which gives birth to all things
展开
-
如何保证多线程的顺序执行
多线程情况下由于会有CPU在不同线程之间的来回切换,各个线程的执行结果会产生交叉 。举个例子:现有T1、T2、T3、主线程四个线程,如何安照T1执行完才执行T2、T2执行完才执行T3、T3执行完最后执行主线程才结束?答案:使用join()方法,让其他线程等待。使用join的线程会独占执行资源,直到使用完毕,其它线程才能获取执行权。代码示例如下:public class Joi...原创 2019-03-20 21:39:46 · 9311 阅读 · 1 评论 -
synchronize与ReentrantLock区别【原创】
synchronize、ReentrantLock区别共同点:都是可重入锁,都可以在一个锁中调用另一个被同一个锁锁定的方法。区别:synchronize锁1、synchronize是java的关键字,是java语言内置的特性,是在JVM层面上实现的2、无论是读操作还是写操作还是混合操作都需要其中一个线程执行完毕之后另一个线程才能执行。这也是它的缺点,多线程情况下读操作...原创 2019-04-12 11:41:25 · 1245 阅读 · 0 评论 -
Java并发包基石-AQS详解
Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedSynchronizer,简称AQS。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸...转载 2019-04-16 13:42:18 · 238 阅读 · 0 评论 -
自旋、偏向锁、轻量级锁、重量级锁区别
java中每个对象都可作为锁,锁有四种级别,按照量级从轻到重分为:无锁、偏向锁、轻量级锁、重量级锁。并且锁只能升级不能降级。在讲这三个锁之前,我先给大家讲清楚自旋和对象头的概念。自旋现在假设有这么一个场景:有两个线程A,B在竞争一个锁,假设A拿到了,这个时候B被挂起阻塞,一直等待A释放了锁B才得到使用权。在操作系统中阻塞和唤醒是一个耗时操作,如果A在很短的时间内就释放了锁,当这个时间与阻...原创 2019-04-16 14:46:29 · 5248 阅读 · 0 评论 -
线程池原理
在面向对象编程中,对象创建和销毁是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是对一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。比如大家所熟悉的数据库连接...原创 2019-04-29 11:29:26 · 374 阅读 · 0 评论 -
锁优化总结
避免死锁死锁出现的四要素:互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放; 请求与保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放 不可中条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用 循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞。减小锁的持有时间...转载 2019-04-29 11:41:20 · 193 阅读 · 0 评论