
java并发编程
文章平均质量分 78
java并发编程
A__17
这个作者很懒,什么都没留下…
展开
-
jdk原子并发类
原理:查询线程安全:使用volatile修饰value,保证value的可见性,不同的线程总是可以获取到最新value值。更新线程安全:使用cas的方式对value进行操作,保证更新操作是线程安全的。这里的CAS:由jdk的Unsafe类实现,利用CPU自身的特性保证原子性,即CPU的指令集封装compare and swap两个操作为一个指令来保证原子性。......原创 2016-12-10 00:57:36 · 4112 阅读 · 0 评论 -
Java内存模型
目录一、前言:二、java内存模型(JMM):三、volatile关键字volatile的使用:四、java中的synchronized关键字五、volatile与synchronized的比较:一、前言:在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 java的并发采用的是共享内存模型:通过读/写内存中的公共状态进行隐式通信。二、java内存模型(JMM):概念:java线程之间的通信是由java内存模型控制的,JMM决定一个线程对共享变量的原创 2015-10-30 23:35:14 · 1215 阅读 · 0 评论 -
java中的synchronized关键字
synchronized的使用synchronized方法:语义:如果A线程调用了某个实例对象的某个synchronized方法M,则A线程就获得了这个实例对象的锁,在A线程调用M方法结束之前(即A线程释放该实例对象的锁之前),其它线程不能调用该实例对象的任何synchronized方法和任何synchronized(this)同步代码块,因为其它线程无法获取到该实例对象的锁。说明:哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁。 synchron原创 2017-05-22 18:54:40 · 742 阅读 · 0 评论 -
java并发包中的Lock
Lock接口:实现:Lock接口的实现是通过聚合了一个同步器的子类来完成线程访问控制的。Lock与synchronized的区别Lock显示地获取和释放锁: void lock(); // 获取锁。 void unlock(); // 释放锁。 可以非阻塞的获取锁: boolean tryLock(); // 调用该方法后立刻返回,如果能获取到锁则返回true,否则返回false; 可以中断地获取锁: void lockInterruptibly() throws Int原创 2017-10-30 23:21:31 · 1009 阅读 · 0 评论 -
java中的线程池
Java中的线程池【1】使用线程池的好处: 1)降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2)提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行。 3)提高线程的可管理性。 说明:不同的业务,我们一般会使用不同的线程池,以便于对同一业务的线程进行统一管理:(日志)监控、线程池参数调优。【2】构造方法: public Threa...原创 2017-10-16 22:33:37 · 443 阅读 · 0 评论 -
Java中的NIO
since:jdk1.41)特点: 基于通道,面向缓冲区的非阻塞IO 2)IO与NIO的比较: 1)IO是面向流的,NIO是(基于通道)面向缓冲区的:IO将数据直接写出到流中或从流中直接读取数据,NIO中所有的数据必须通过缓冲区来处理。 2)IO以流(逐字节)的方式处理数据,NIO以块的方式处理数据。 3)IO是阻塞的,NIO是非阻塞的: 传统的IO流: 1>原创 2014-12-31 14:28:26 · 994 阅读 · 0 评论 -
java中的队列同步器AQS -- AbstractQueuedSynchronizer
1)原理: 1)使用一个int成员变量表示同步状态(private volatile int state;),通过同步队列(一个FIFO双向队列)来完成同步状态的管理(即:线程的排队)。 2)当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入到同步队列的尾部,并且当前线程(因进行自旋操作)被阻塞。 3)首节点是成功获取到同步状态的节点,首原创 2017-10-23 21:30:55 · 683 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码分析
package java.util.concurrent.locks;import java.util.concurrent.TimeUnit;import java.util.ArrayList;import java.util.Collection;import java.util.Date;import sun.misc.Unsafe;public abstract clas原创 2017-11-13 22:08:20 · 452 阅读 · 0 评论 -
ArrayBlockingQueue VS LinkedBlockingQueue
ArrayBlockingQueue VS LinkedBlockingQueue 比较: 1)队列的大小不同: ArrayBlockingQueue 是有界队列,且初始化时必须指定队列的大小。 LinkedBlockingQueue 是无界队列,在初始化的时候可以指定队列的大小从而变成有界队列。注:对于无界队列,当入列速度大于出列速度时可能会造成内存溢出。 2)实...原创 2018-05-24 23:38:11 · 687 阅读 · 0 评论 -
java中常用的并发工具
java中常用的并发工具1)闭锁CountDownLatch 功能:让一个主线程等待一组工作线程执行完毕之后,才继续执行主线程,与join()方法的功能类似。 原理: 1)CountDownLatch是通过一个计数器来实现的,计数器的初始值为需要等待线程的数量。eg:CountDownLatch c = new CountDownLatch(2); // 等待线程的数量为2原创 2017-10-09 22:28:51 · 620 阅读 · 0 评论 -
java对象的内存布局
HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。1)对象头:包括标记字段和类型指针两部分内容(注:如果是数组对象,则包含三部分内容): 1)Mark Word(标记字段):用于存储运行时对象自身的数据。 1>占用内存大小与虚拟机位长一致,在运行期间,考虑到JVM的空间效率,Mark Word被设计成为一个非固定的数据结构,以便存储更多有效的数据。原创 2017-10-09 21:32:33 · 1913 阅读 · 1 评论 -
java线程类Thread中的方法
线程类Thread中的方法 1)currentThread(): public static Thread currentThread() 说明:返回当前正在执行的线程对象的引用,即返回调用当前代码的线程对象。 2) join(): public final void join(long millis) throws InterruptedException 参数原创 2017-06-14 21:54:00 · 876 阅读 · 0 评论 -
Object类中的wait()方法和notify()方法
【Object类中的wait()方法和notify()方法】 wait(): public final void wait(long timeout) throws InterruptedException 参数:等待的时间,可选,不填则默认为0。 说明: 1>使线程主动释放对象锁,并进入等待状态,直到它被其他线程通过notify()或notifyAll唤醒或者超过指定的等待原创 2017-06-04 10:54:31 · 3124 阅读 · 0 评论 -
ThreadPoolExecutor源码分析
public class ThreadPoolExecutor extends AbstractExecutorService { // 线程池中线程的数量和线程池的状态(runState):低29位存线程的数量,高3位存runState private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));原创 2017-11-13 22:13:54 · 613 阅读 · 0 评论 -
CountDownLatch源码分析
package java.util.concurrent;import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class CountDownLatch { /** * Synchronization control For CountDownLatch. * Uses AQS原创 2017-11-13 22:11:37 · 401 阅读 · 0 评论 -
CyclicBarrier源码分析
package java.util.concurrent;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class CyclicBarrier { /** * Each use of the barrier is rep原创 2017-11-13 22:12:59 · 403 阅读 · 0 评论 -
Spring中的@Scope注解
Spring中的@Scope注解:源码: @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Scope { /** * Specifies the scope to use for the anno...原创 2018-03-29 21:16:17 · 2003 阅读 · 0 评论 -
乐观锁和悲观锁
乐观锁: 原理: 1)通过在数据库表中添加一个版本号(version)字段来实现乐观锁。 2)更新前先获取到该条数据的版本号(v1),然后在更新语句(更新数据&更新版本号)的where条件中添加 version=v1 条件, 1>若满足version=v1条件(即:成功获取乐观锁),则成功更新数据且版本号+1; 2>若不满足version=v1条件(即:...原创 2015-09-23 15:51:30 · 720 阅读 · 0 评论 -
CAS(Compare and Swap)算法
CAS(Compare and Swap)算法: 1)原理: 1)CAS有3个操作数,内存值V,预期值(旧值)A,要写入的新值B。 2)当且仅当 预期值A=内存值V 时,将内存值V修改为新值B,否则什么都不做。 3)CAS可以看作是一种乐观锁。 2)应用:用于管理对共享数据的并发访问。 3)CAS存在的问题: 1)ABA问题:如果一个变量的值原来是A,然...原创 2017-10-09 22:02:44 · 1039 阅读 · 0 评论 -
多线程中两个必要的开销:线程的创建、上下文切换
多线程中两个必要的开销:线程的创建、上下文切换上下文切换: 概念: 当前任务执行一个时间片后会切换到下一个任务。在切换之前,上一个任务的状态会被保存下来,下次切换回这个任务时,可以再加载这个任务的状态,任务从保存到再加载的过程就是一次上下文切换。 说明: 1)时间片是CPU分配给各个线程的时间,时间片一般是几十毫秒。 2)CPU通过给每个线程分配CPU时间片,并且不停地切...原创 2017-10-09 22:25:39 · 5748 阅读 · 0 评论 -
java并发包下的LockSupport
java.util.concurrent.locks.LockSupport 概念:用LockSupport来实现线程的阻塞和唤醒。 阻塞线程的方法: public static void park():阻塞当前线程,只有调用unpark()方法或者当前线程被中断,该方法才会返回。 public static void parkNanos(long nanos) publ原创 2017-10-30 23:27:10 · 828 阅读 · 0 评论