多线程
# 多线程
我就想起个通过的名字
这个作者很懒,什么都没留下…
展开
-
Java并发编程:线程池的使用(源码解析)
Java并发编程:线程池的使用Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个转载 2017-12-18 10:07:46 · 299 阅读 · 0 评论 -
Java集合之Collection
Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。Java集合框架如下图: 由上图可以看到Java框架主要是Collection和...转载 2018-02-27 15:55:49 · 139 阅读 · 0 评论 -
并发编程--AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray
AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray是对数组的线程安全操作,简单来说其操作方式是使用sun.misc.Unsafe来对数组对象进行CAS原子操作。AtomicIntegerArray数组对象:[java] view plain copyprivate final int[] array; 添加操作为:[java] vi...转载 2018-02-27 13:43:29 · 130 阅读 · 0 评论 -
并发编程--原子类AtomicLong、AtomicBoolean和AtomicReference
在上一篇博客 并发编程--原子类AotmicInteger中我们已经简单介绍了一下AtomicInteger相关的知识,简单来说AtomicLong的实现原理与AtomicInteger是相同的,用volatile来修饰变量value和使用sun.misc.Unsafe来完成对value的原子操作。AtomicBoolean的实现机制还是比较简单的,通过判断用volatile修改的value与...转载 2018-02-27 13:42:30 · 586 阅读 · 0 评论 -
并发编程--原子类AotmicInteger
前几篇博客中我们已经介绍了线程、volatile、synchronized和cas自旋相关的知识,接下来我介绍一下jdk提供的并发编程包java.util.concurrent中相关的实现类知识。AtomicInteger简单来说就是一个能进行原子操作的Integer,这样在多线程操作下对AtomicInteger的操作是原子操作的,操作后的值对所有线程都是立即可见的。简单来说其实现就是使转载 2018-02-27 13:34:15 · 635 阅读 · 0 评论 -
并发编程--CAS自旋锁
在前两篇博客中我们介绍了并发编程--volatile应用与原理和并发编程--synchronized的实现原理(二),接下来我们介绍一下CAS自旋锁相关的知识。一、自旋锁提出的背景由于在多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclusion),这时会引入锁的机制,只有获取了锁的进程才能获取资源访问。即是每次只能有且只有一个进程能获取锁,才能进入自己的临界区,...转载 2018-02-27 11:16:38 · 186 阅读 · 0 评论 -
并发编程--volatile应用与原理
volatile在并发编程中扮演着重要的角色(并发编程包java.util.concurrent中运用了volatile的特性),volatile被称为轻量级锁,它在多处理器开发中保证了共享变量的“可见性”,可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程...转载 2018-02-27 11:15:19 · 93 阅读 · 0 评论 -
并发编程--synchronized的实现原理(二)
上一篇博客Thread--synchronized示例(一)中我们简单介绍了一下有关synchronized相关的知识,接下来我们详细介绍一下synchronized的实现原理。在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁,随着对其的实现的各种优化,在有些情况下他就并不那么重了,为了减少获取锁和释放锁带来的性能消耗而引入了偏向锁和轻量级锁,以及对锁的存储结...转载 2018-02-27 11:13:00 · 107 阅读 · 0 评论 -
并发编程--synchronized示例(一)
在Java中,每一个对象有且仅有一个同步锁,同步锁是依赖于对象而存在。当调用某个对象的synchronized方法时,就获取了该对象的同步锁。不同线程对同步锁的访问时互斥的。synchronized基本规则:(一)当一个线程访问某个对象的synchronized方法或者代码块时,其他线程对此对象的synchronized方法或者代码块的访问都会被阻塞。(二)当一个线程访问某个对象的synchron...转载 2018-02-27 11:11:33 · 238 阅读 · 0 评论 -
Thread--interrupt和线程终止
interrupt()的作用是中断本线程,本线程中断自己是被允许的,其他线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限,可能会抛出SecurityException异常。一、终止处于“阻塞状态”的线程:通过中断方式终止处于阻塞状态的线程,当线程由于被调用了sleep(),wait(),join()等方法而进入阻塞状态,此时调用线程的interrupt()将线...转载 2018-02-27 11:10:11 · 127 阅读 · 0 评论 -
Thread--Join方法
join()函数是Thread类中定义的一个方法,join()的作用是让主线程等待子线程结束之后才能继续进行,简单的示例说明:[java] view plain copy// 主线程 public class Father extends Thread { public void run() { Son s = new Son(); s.start(...转载 2018-02-27 11:08:55 · 183 阅读 · 0 评论 -
Thread--线程休眠sleep
sleep()的作用是让当前线程进入休眠,当前线程会由运行状态进入到阻塞状态,sleep()可以指定休眠时间,休眠时间会大于等于该休眠时间,在线程被重新唤醒时,线程的状态由阻塞状态变成就绪状态,从而等待CPU进行调度执行。示例代码:[java] view plain copyclass ThreadA extends Thread{ public ThreadA(String name)...转载 2018-02-27 10:38:36 · 348 阅读 · 0 评论 -
Thread--线程让步yield
yield()函数的作用是让步,它让当前线程由运行状态进入就绪状态,而不是像wait()一样进入阻塞状态。因此,并不能保证在当前线程调用yield()之后,其他具有相同优先级的线程一定能获得执行权,也有可能是当前线程又重新进入了运行状态。示例代码:[java] view plain copyclass ThreadA extends Thread{ public ThreadA(St...转载 2018-02-27 10:37:16 · 163 阅读 · 0 评论 -
Thread--线程让步yield
yield()函数的作用是让步,它让当前线程由运行状态进入就绪状态,而不是像wait()一样进入阻塞状态。因此,并不能保证在当前线程调用yield()之后,其他具有相同优先级的线程一定能获得执行权,也有可能是当前线程又重新进入了运行状态。示例代码:[java] view plain copyclass ThreadA extends Thread{ public ThreadA(St...转载 2018-02-27 10:26:16 · 137 阅读 · 0 评论 -
Java-线程Thread等待与唤醒
Java线程的等待与唤醒主要包括几个方法:(1)notify():唤醒在此对象监视器上等待的单个线程。(2)notifyAll():唤醒在此对象监视器上等待的所有线程。(3)wait():让当前线程处于阻塞状态,同时释放它所持有的锁。(4)wait(long timeout):让线程处于阻塞状态,直到其他线程调用此对象的notify()或者notifyAll()方法,或者超过指定的时间量,当前线程...转载 2018-02-27 09:38:21 · 258 阅读 · 0 评论 -
Java-线程Thread方法start()和run()
(1)start():作用是启动一个新的线程,新线程会执行线程中相应的run()方法,start()不能被重复调用,(2)run():该方法和普通的成员方法一样,可以被重复调用。如果直接调用run()的话,会在当前线程中执行run(),而并不会启动新的线程。示例代码:[java] view plain copypublic class NewThread extends Thread{ ...转载 2018-02-27 09:33:51 · 153 阅读 · 0 评论 -
Thread--基本概念
一、进程与线程的区别:进程是资源分配和运行调度的基本单位,一个进程可以看成是一个独立的程序,在内存中会有其对应的代码空间和数据空间,进程间需要通过消息通信来进行同步。每个进程都有自己的地址空间。线程是执行处理机运行调度的基本单位,所有的线程共享器所属的进程的所有资源与代码,同时线程会拥有自己私有的堆栈。多线程则共享所在进程的地址空间。线程的状态图:线程包括5种状态:(1)新建状态(new):线程对...转载 2018-02-27 09:32:00 · 224 阅读 · 0 评论 -
Thread--Thread和Runnable
在Java中常用的实现多线程的两种方式是使用Thread类或者实现Runnable接口。Runnable是一个接口,并且只包含了一个run()方法。基于Java8的Runnable源码:[java] view plain copy@FunctionalInterface public interface Runnable { /** * When an object implemen...转载 2018-02-27 09:19:10 · 128 阅读 · 0 评论 -
Java集合之List
List继承自Collection的接口,List也是集合的一种。List是有序队列,List中的没一个元素都会有一个索引,第一个元素的索引是0,往后的元素的索引值依次+1,List中允许有重复的元素。List框架:List接口源码:[java] view plain copypublic interface List<E> extends Collection<E> ...转载 2018-02-27 16:03:43 · 148 阅读 · 0 评论