多线程
zhoutaoping1992
这个作者很懒,什么都没留下…
展开
-
并发编程笔记:synchronized关键字浅析
一、synchronized关键字1.1、锁的状态(1)无锁:在没有开启偏向锁或者偏向锁延迟未到或者批量撤销后,对象创建完成后,没有任何线程使用该对象来加锁,此时该对象的状态是无锁。对应的JAVA对象头lock=01,biased_lock=0。(biased_lock=0的含义表示不可偏向)(2)偏向锁:对象创建完成后处于可偏向状态,某一个线程使用该对象来加锁,那么这个对象就偏向这个线程。对应的JAVA对象头lock=01,biased_lock=1。(3)轻量级锁:当有多个线程交替使用某原创 2020-06-07 18:21:04 · 322 阅读 · 1 评论 -
并发编程笔记十一:线程池
十一、线程池11.1、Executor框架11.2、Executor接口Executor接口代表了一个执行器,他可以按照不同的策略去执行提交过来的任务。public interface Executor { void execute(Runnable command);}通过execute(Runnable command)方法,我们可以将需要执行的...原创 2020-03-22 13:14:32 · 123 阅读 · 0 评论 -
并发编程笔记十:基于AQS的同步工具
十、基于AQS的同步工具10.1、CountDownLatch倒数器10.1.1、使用场景当我们使用多线程处理一个大任务时,我们要把大任务转换为若干个小任务去执行。当这些小任务都执行完成时,我们需要汇总这些小任务的执行结果。所以汇总线程需要等到所有小任务都执行完成之后才能继续执行,这时候我们就可以使用CountDownLatch工具了。10.1.2、源码分析CountDownL...原创 2020-03-22 13:14:23 · 161 阅读 · 0 评论 -
并发编程笔记九:AQS
九、锁的底层AQS9.1、AQS的简介AQS的全称是AbstractQueuedSynchronizer抽象队列同步器。它是一个抽象类,继承它可以自定义各种同步工具。ReentrantLock的底层使用的就是AQS。9.2、独占模式和共享模式在某些场景下,我们需要在一个线程执行一段代码时,其他线程就不可以进入这段代码执行,就是说在一个时间点只能有一个线程执行这段代码块,这种同步模式...原创 2020-03-21 18:31:26 · 163 阅读 · 0 评论 -
并发编程笔记八:CAS
八、非阻塞操作CAS8.1、锁的劣势不管是内置锁synchronized还是显示锁Lock,在一个线程获取到锁之后,另一个线程再去尝试获取锁的时候,都会因为无法获取到锁而进入阻塞状态。当获取锁的线程释放锁之后,其余在阻塞状态下的线程才能获取到锁。8.2、CompareAndSwapjava中的锁是悲观的技术,在操作之前总是认为会有其他线程会干预自己的操作,所有对需要操作的资源进行加...原创 2020-03-21 18:31:18 · 80 阅读 · 0 评论 -
并发编程笔记七:显示锁
七、显示锁7.1、内置锁synchronized的缺陷 内置锁使用的格式 synchronized(锁对象){ // 获取锁,获取不到会一直阻塞 同步代码块 } // 释放锁缺陷:获取锁的线程在无法获取锁的时候,会一直阻塞在获取锁的位置,无法中止,会无限的等待下去。无法对获取不到锁做相关的逻...原创 2020-03-21 18:31:11 · 83 阅读 · 0 评论 -
并发编程笔记六:性能问题
六、性能问题6.1、性能在一定的配置下,如果一个程序的运行时间越短,吞吐量越大,我们就说这个程序的性能越好。现代计算机的cpu核数越来越多,cpu执行速度越来越快,多线程的程序可以充分利用多核cpu的性能,提高cpu处理器的利用率。所以,大部分情况下多线程能提高程序的性能。但是如果引入线程的开销和同步代码块对性能的影响大于处理器的利用率,程序的性能是降低的。6.2、多线程的开销和同...原创 2020-03-21 18:31:02 · 121 阅读 · 0 评论 -
并发编程笔记五:活跃性问题
五、活跃性问题活跃性问题包括死锁、活锁、饥饿,最著名的就是死锁问题了。5.1、死锁5.1.1、什么是死锁系统中的每一个线程都持有着其他线程需要的资源,同时又想获取其他线程已经拥有的资源,并且每个线程在获取全部想要的资源之前不会释放已经拥有的资源,那么这种情况就称为死锁。例如:当线程一持有A锁,想要获取B锁的同时,线程二持有者B锁,并且想要获取A锁。那么线程一和线程二就产生了死锁...原创 2020-03-21 18:30:55 · 159 阅读 · 0 评论 -
并发编程笔记四:安全性问题
四、安全性问题 安全性问题主要有原子性操作、内存可见性、指令重排序三大问题4.1、原子性操作4.1.1、问题描述原子性操作是指一个或一组操作在一个线程执行完成后,另一个线程才能进行该操纵,这些操作是不可切割的,线程不能在这些操作上交替执行。由于有些计算需要依赖之前读取到的结果,当执行该计算时,需要依赖的值在内存中已经被其他线程修改了,所以他使用了一个错误的值进行计算...原创 2020-03-21 18:30:45 · 225 阅读 · 0 评论 -
并发编程笔记三:并发编程的问题
三、并发编程的问题3.1、共享和可变在并发编程中,如果一个变量可以被多个线程访问,那么这个变量是共享的;如果一个变量的值可以被访问他的线程修改,那么这个变量是可变的。对于共享可变变量就存在着线程问题。3.2、线程并发问题对于共享可变变量存在着三大问题:安全性问题、活跃性问题、性能问题...原创 2020-03-21 18:30:38 · 86 阅读 · 0 评论 -
并发编程笔记二:线程
二、线程现代操作系统中,线程是被操作系统调度和执行的单位。进程是拥有资源所有权的单位。Java中的线程Thread是对操作系统的线程的一种抽象,他与操作系统的线程有些不一样。2.1、线程的特点1)一个进程中包含一个或多个进程;2)同一个进程中的线程可以共享进程中的资源,包括内存资源、IO资源等等;3)线程创建、切换、销毁成本比进程小;4)线程间通信方便、效率高,因为可以共享...原创 2020-03-21 18:30:30 · 344 阅读 · 0 评论 -
并发编程笔记一:进程
一、进程:1.1、进程的概念一个执行的程序叫做一个进程1.2、进程的特点1)资源所有权: 进程中所拥有的资源是不能和其他进程共享的2)调度/执行 操作系统会为进程分配时间片1.3、进程的状态在操作系统级别上,进程分为5种状态。1)新建 进程刚创建的时候;2)就绪 进程处于就绪队列中的状态,只有在就绪...原创 2020-03-21 18:30:12 · 132 阅读 · 0 评论