并发编程
文章平均质量分 76
sugar-foxs
这个作者很懒,什么都没留下…
展开
-
java锁
synchronized synchronized是虚拟机的内置锁 对于同步块:编译之后,会在同步块的前后形成 monitorenter 和 monitorexit 两个字节码指令,每个对象都具有一个monitor与之关联,拥有了monitor的线程便锁住了对象。 对于同步方法:编译之后,该同步方法有一个同步标志来表明该方法是同步方法。 sync...原创 2020-01-11 13:58:49 · 171 阅读 · 0 评论 -
生产者和消费者模式
生产者: class Producer implements Runnable { protected BlockingQueue queue; Producer(BlockingQueue theQueue) { this.queue = theQueue; } public void run() { try {原创 2017-09-18 10:20:38 · 378 阅读 · 0 评论 -
多线程面试题
1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提转载 2017-07-20 22:56:21 · 174 阅读 · 0 评论 -
Semaphore
Semaphore是一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 释放一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release(转载 2017-08-02 10:48:43 · 219 阅读 · 0 评论 -
JAVA多线程
1,先弄清两个概念:并发和并行. 并行指两个及多个事件实际意义的同时进行,而并发是宏观上的并行,其实一个cpu上还是顺序执行,只是cpu通过调度算法快速的切换不同事件执行,达到看似多个事件同时进行的效果. 说白了并发是为了提高效率接近并行的执行效果.而实现并发的手段是多进程或多线程. 本文主要从线程的产生,状态,同步,通信,安全等方面介绍java中的多线程: 1, 线程产生: 1,原创 2017-06-16 20:29:12 · 180 阅读 · 0 评论 -
volatile
volatile关键字能够保证变量的可见性,这就先要了解Java内存模型,Java内存模型是所有线程有一个共享的主内存,每个线程都有自己的工作内存,工作内存里都会保存一份共享变量的副本,对变量修改都是修改本线程的变量副本,然后刷新到主内存,但是刷新的时间是不确定的。volatile修饰了变量之后,每个线程修改变量副本之后都会立即刷新到主内存,读取这个变量也会强制从主内存读取最新值。所以volati原创 2017-07-29 23:07:44 · 171 阅读 · 0 评论 -
等待多线程完成的CountDownLatch
CountDownLatch 1、类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。转载 2017-08-02 10:09:05 · 173 阅读 · 0 评论 -
进程与线程区别
1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.转载 2017-08-18 20:40:22 · 126 阅读 · 0 评论 -
死锁的条件
死锁的四个必要条件: 1,互斥:同一个资源每次只能一个进程使用。 2,资源不可抢占:不可抢占其他进程持有的资源。 3,循环等待:若干进程互相循环等待资源。 4,请求与保持:持有一个资源,又在请求另一个资源,请求不到资源就一直保持这个资源。 只要其中一个条件不满足,死锁就不存在。原创 2017-08-18 19:10:58 · 219 阅读 · 0 评论 -
AtomicInteger源码分析
AtomicInteger 是一个支持原子操作的 Integer 类,就是保证对AtomicInteger类型变量的增加和减少操作是原子性的,不会出现多个线程下的数据不一致问题。 AtomicInteger底层使用了CAS乐观锁的思想。CAS一直 不太懂,今天正好好好研究一下。 下面先分析下源码:原创 2017-07-25 10:30:26 · 242 阅读 · 0 评论 -
了解CAS
CAS实现了无锁的线程安全 CAS:compareAndSwap,字面上是说比较再交换。 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。 当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 CAS比较与交换的伪代码可以表示为: do{ 备份旧数据; 基于旧数据构造新数据; }while(!CAS( 内存地址,备份的旧数据,新数据 )) 就是说,当原创 2017-07-25 17:13:18 · 473 阅读 · 0 评论 -
可循环使用的屏障CyclicBarrier
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。 构造方法: CyclicBarrier(int parties) 创建一个新的 CyclicBarrier ,当给定数量的线程(线程)原创 2017-08-02 10:34:49 · 1480 阅读 · 0 评论 -
线程本地存储ThreadLocal
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal和线程同步机制相比有什么优势呢?ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。 在同步机制中,通过对象的锁机转载 2017-07-08 20:45:33 · 346 阅读 · 0 评论 -
ReentrantLock源码
Lock的关系图,用的比较多的是ReentrantLock,下面介绍ReentrantLock ReentrantLock含有三个内部类:Sync,NonfairSync,FairSync. Sync继承自AbstractQueuedSynchronizer,内部具有ConditionObject类(实现了Condition接口) 默认使用NonfairSync。可以通过构造器传参bo原创 2017-06-22 11:14:05 · 260 阅读 · 0 评论 -
Executor框架
Executor框架包括Executor,ExecutorService,ScheduleExecutorService,Executors,线程池,各种任务,Future. 1,Executor接口: public interface Executor { void execute(Runnable var1); } 只有一个execute方法,接受Runnable实例,来执行原创 2017-07-05 22:00:24 · 198 阅读 · 0 评论 -
AbstractQueuedSynchronizer
原文地址:http://ifeve.com/introduce-abstractqueuedsynchronizer/转载 2017-07-26 09:48:38 · 137 阅读 · 0 评论