多线程系列
BryantLmm
努力写好每一行代码
展开
-
进程与线程
一.进程与线程的定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 二.进程与线程的区原创 2017-08-13 20:47:52 · 238 阅读 · 0 评论 -
AQS
前言最近打算重新温习下JUC包,去年虽然有看过相关源码,但是理解的并不到位,最近不是特别忙,就打算花这个时间重新来梳理下。先从JUC中锁的实现的核心AQS说起。AQS是一个抽象类,提供了一系列公共的方法,比较重要的操作有两个获取(acquire)和释放(release),其中每个操作有对应的一些扩展方法,比如超时、共享锁、可中断等。获取独占锁 public final void...原创 2018-12-18 13:28:44 · 259 阅读 · 0 评论 -
ReentrantLock
在分析了AQS之后,再来看ReentrantLock就非常简单了。ReentrantLock是一个可重入的独占锁。我们来看下具体的实现。先看构造方法 /** Synchronizer providing all implementation mechanics */ private final Sync sync; public ReentrantLock() { ...原创 2018-12-18 14:48:07 · 3010 阅读 · 0 评论 -
CountDownLatch
在复习了ReentrantLock可重入的独占锁后,我们来分析下使用了共享锁的CountDownLatch。CountDownLatch使用示例先看一个CountDownLatch的使用示例。package com.wangcc.springbootexample.concurrency;import java.util.Random;import java.util.concurre...原创 2018-12-18 15:19:24 · 175 阅读 · 0 评论 -
LimitLatch
前言之前分析的ReentrantLock和CountDownLatch都是JDK中对AQS的利用,分别实现了独占锁和共享锁。接着我们再来看一个LimitLatch,来学习下我们可以怎么将AQS应用到我们自己的程序中。LimitLatch这个类是我在看Tomcat源码的时候看到的,当时并没有太在意,也是这次复习JUC包的时候突然想起的,所以就想着来看下具体实现。Tomcat使用LimitLat...原创 2018-12-18 16:11:36 · 666 阅读 · 0 评论 -
ReentrantReadWriteLock
前言之前分析了使用AQS实现的共享锁和独占锁,今天来分析一下ReentrantReadWriteLock,这个即使用了共享锁(读锁)又使用了独享锁(写锁)的类。与Mysql中的S锁(共享锁,读锁)一样,ReentrantReadWriteLock中的读锁只允许继续加读锁,而不允许加写锁。而写锁则与Mysql中X锁(排他锁)一样,不允许继续加任何锁,知道写锁被释放。今天我们就来分析下Reen...转载 2018-12-18 17:29:51 · 259 阅读 · 0 评论 -
并发与并行的区别
如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于**“存在”**这个词。在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过...转载 2018-12-18 17:47:13 · 709 阅读 · 0 评论 -
SimpleDateFormat线程安全问题
前言最近在查资料的时候,偶然看到了SimpleDateFormat不是线程安全的类的相关资料,说实话,一开始看的时候还是惊讶了一把的,从来没想过这个类居然不是线程安全的。今天就来看看这个类的线程安全问题。SimpleDateFormat线程安全分析先看一个很简单的日期处理工具类public class DateUtil { private static final SimpleD...原创 2018-12-24 15:46:35 · 311 阅读 · 0 评论 -
线程池
为什么要使用线程池为了尽可能的去压榨CPU,我们会在程序中使用多线程技术,这样在一些情景下会显著的减少CPU的闲置时间,增加CPU的吞吐能力。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程...原创 2018-12-25 16:15:27 · 271 阅读 · 0 评论 -
interrupt()方法
title:线程中断date:2017年11月4日23:02:38今天来看看线程中断的问题。当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断...原创 2018-11-06 19:34:04 · 13617 阅读 · 2 评论 -
Synchronized关键字
title:synchronized关键字date:2017年10月30日22:18:19一.可内置重入锁每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。(当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。)...原创 2018-11-06 18:02:06 · 137 阅读 · 0 评论 -
wait notify
title:wait notifydate:2017年10月30日23:15:29一.wait notify等方法简单介绍在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;noti转载 2017-11-04 19:10:27 · 203 阅读 · 0 评论 -
interrupt()方法
title:线程中断date:2017年11月4日23:02:38今天来看看线程中断的问题。当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示转载 2017-11-11 14:26:07 · 1727 阅读 · 0 评论 -
volatile关键字
title:volatile关键字date:2017年11月5日14:54:25之前,我们讲线程中断的时候,使用了volitate关键字完成了最简单的中断操作,那我们今天就来好好的探究下volitate关键字。争取做到知道什么时候用volitate关键字,他的作用是什么。一.volatile的作用在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而转载 2017-11-11 14:27:29 · 9345 阅读 · 0 评论 -
主内存与工作内存
title:Java内存模型date:2017年11月5日16:17:54主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量主要是指共享变量,存在竞争问题的变量。Java内存模型规定所有的变量都存储在主内存中,而每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝转载 2017-11-11 15:18:52 · 642 阅读 · 0 评论 -
this逃逸
title:this逃逸date:2017年11月11日18:17:51我们在说Java内存模型的时候提到了final域在初始化保证线程安全的相关特性。里面有句话是这样说的:被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),那么在其他线程中就能看到final字段的原创 2017-11-11 18:54:44 · 381 阅读 · 0 评论 -
join()方法
title:join方法date:2017年11月11日23:28:13今天来简单看一下join()方法,join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。直接上代码:package com.wangcc.MyJavaSE.thread.join;public class JoinTest { public static void main(String []args)原创 2017-11-11 23:48:57 · 631 阅读 · 0 评论 -
ReentrantLock
title:ReentrantLockdate:2017年11月12日12:40:32 在生产者消费者问题中,我们提到了利用锁和Condition条件来解决问题。今天我们就来看下锁是怎么实现的。private final Lock lock=new ReentrantLock();lock.lock();ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是原创 2017-11-12 20:00:26 · 204 阅读 · 0 评论 -
PC问题
title:PC问题date:2017年11月12日00:17:02 在大学学习OS的时候,我们学习进程管理的时候,讲进程同步与互斥的时候,有用几个例子来进行说明:生产者消费者问题,读者写者问题,哲学家问题,三人吸烟问题等。有空还是需要好好去回顾下四大基础课的。今天我们就先来讲讲消费者生产者问题。 在学习OS的时候我们解决生产者消费者问题是通过PV原语来控制的。而在我们的Java语言这门原创 2017-11-12 20:01:23 · 656 阅读 · 0 评论 -
ReentrantLock(二)Lock.unlock()分析
title:(二)Lock.unlock()分析date:2017年11月12日19:32:35来看下unlock()方法 public void unlock() { sync.release(1); }unlock()是解锁函数,它是通过AQS的release()函数来实现的。 在这里,“1”的含义和“获取锁的函数acquire(1)的含义”一样,它是设置“释放锁的状态原创 2017-11-12 20:01:46 · 455 阅读 · 0 评论 -
Spring Task
前言在一开始学习定时任务的时候是使用的quartz来实现的。后来习惯于全注解的开发模式。在SpringBoot环境中,只需要在启动类上加上EnableScheduling注解,然后在需要使用定时任务的方法上加上Scheduled注解,当然方法所属的类需要在Spring环境中。在启动类中加上EnableScheduling注解这一步是为了生成ScheduledAnnotationBeanPostP...原创 2018-12-25 17:03:32 · 1681 阅读 · 0 评论