java并发编程
文章平均质量分 74
gongpulin
这个作者很懒,什么都没留下…
展开
-
偏向锁、轻量级锁
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁、偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java 并发编程:volatile的使用及其原理 一、重量级锁 ...转载 2020-03-01 22:49:31 · 517 阅读 · 0 评论 -
实现一个线程安全的单例,前提是不能加锁
单例,大家肯定都不陌生,这是Java中很重要的一个设计模式。稍微了解一点单例的朋友也都知道实现单例是要考虑并发问题的,一般情况下,我们都会使用synchronized来保证线程安全。那么,如果有这样一道面试题:不使用synchronized和lock,如何实现一个线程安全的单例?你该如何回答?C类应聘者:可以使用饿汉模式实现单例。如:public class Singleton {...转载 2020-02-15 20:35:33 · 216 阅读 · 1 评论 -
美团后台篇中的ReentrantLock
https://juejin.im/post/5e37824ff265da3e3a5381b8?utm_source=gold_browser_extension原创 2020-02-15 20:21:39 · 227 阅读 · 0 评论 -
java并发之Thread
线程的状态线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。当需要新起一个线程来执行某个子任务时,就创建了一个线程。但是线程创建之后,不会立即进入就绪状态,因为线程的运行需要一些条件(比如内存资源,在前面的JVM原创 2016-04-23 18:47:04 · 1304 阅读 · 0 评论 -
java并发之concurrent包的结构
软件包 java.util.concurrent接口摘要BlockingDeque支持两个附加操作的 Queue,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用。BlockingQueue支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。Ca原创 2016-04-24 22:05:32 · 1850 阅读 · 0 评论 -
java并发之CyclicBarrier(障碍器)
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一原创 2016-04-24 22:53:43 · 2341 阅读 · 2 评论 -
java并发之Semaphore(信号量)
在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作用,通过对信号量的不同操作,可以分别实现进程间的互斥与同步。当然它也可以用于多线程的控制,我们完全可以通过使用信号量来自定义实现类似Java中的synchronized、wait、notify机制。 Java并发包中的信号量Semaphore实际上是一个功能完毕的计数信号量,从概念上讲,它维护了一个许可集合,对原创 2016-04-24 22:58:20 · 1380 阅读 · 0 评论 -
Java ConcurrentModificationException异常原因和解决方法
Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。 以下是本文目录大纲: 一.Concurr转载 2016-08-17 11:32:16 · 358 阅读 · 0 评论 -
Thread和Runnable实现多线程的区别
Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势: 1、可以避免由于Java的单继承特性而带来的局限; 2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的; 3、适合多个相同程序代码的线程区处理同一资原创 2016-08-17 12:13:41 · 384 阅读 · 0 评论 -
Callable、Future和FutureTask
Java并发编程:Callable、Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Jav转载 2016-08-17 12:18:21 · 295 阅读 · 0 评论 -
Timer和TimerTask
下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:123456原创 2016-08-25 22:24:06 · 270 阅读 · 0 评论 -
并发容器之CopyOnWriteArrayList
原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOn原创 2016-08-25 22:38:25 · 257 阅读 · 0 评论 -
java并发之ThreadLocal
ThreadLocal为每个使用该变量的线程提供独立的变量副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 对比同步机制与ThreadLocal,可以得出同步通过加锁的方式实现了线程数据共享,也就是以时间换空间,而Th原创 2016-04-23 17:53:11 · 2496 阅读 · 0 评论 -
Java并发之线程间的通信Condition
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模原创 2016-04-22 23:21:46 · 492 阅读 · 0 评论 -
java并发之ConcurrentHashMap
下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开转载 2016-04-29 23:07:05 · 2082 阅读 · 0 评论 -
java内存模型
JAVA内存模型对于我们平时开发的业务应用来说,内存应该是访问速度最快的存储设备,对于频繁访问的数据,我们总是习惯把它们放到内存缓存中,有句话不是说么,缓 存就像是清凉油,哪里有问题就抹一抹。但是CPU的运算速度比起内存的访问速度还要快几个量级,为了平衡这个差距,于是就专门为CPU引入了高速缓存,频 繁使用的数据放到高速缓存当中,CPU在使用这些数据进行运算的时候就不必再去访问内存。但是在原创 2016-05-04 14:31:35 · 2659 阅读 · 0 评论 -
java并发之原子性、可见性、有序性
原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。 上面一句话虽然看起来简单,但是理解起来并不是那么容易。看下面一个例子i: 请分析以下哪些操作是原子性操作:12原创 2016-04-21 18:30:28 · 3852 阅读 · 0 评论 -
java并发简介
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好原创 2016-04-20 22:54:28 · 302 阅读 · 0 评论 -
线程安全问题及解决办法
一.什么时候会出现线程安全问题?在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题:由于每个线程执行的过程是不可控的,所以很可能导致最终的结果与实际上的愿望相违背或者直接导致程序出错。举个简单的例子: 现原创 2016-04-21 17:03:00 · 3469 阅读 · 0 评论 -
java并发之synchronized
在Java中,每一个对象都拥有一个锁标记(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取了该对象的锁才能访问。 在Java中,可以使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便获得了该对象的锁,其他线程暂时无法访问这个方法,只有等待这个方法执行完毕或原创 2016-04-21 18:08:23 · 1269 阅读 · 0 评论 -
java并发之Lock
从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 1.Lock 首先要说明的就是Lock,通过查看Lock的源码可知,Lock是一个接口:12345678public interface原创 2016-04-21 19:10:19 · 1523 阅读 · 0 评论 -
java并发之Lock与synchronized的区别
1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现; 2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁; 3)Lock可以让等待锁的线程响原创 2016-04-21 19:22:06 · 5560 阅读 · 0 评论 -
java并发之volatile
开篇来重点,根据《Java并发编程实战》正确使用 volatile 变量的条件:您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:(1)对变量的写操作不依赖于当前值。(2)该变量没有包含在具有其他变量的不变式中。再次之前,必须了解一些知识 可见性是指当多个线程访问同一个变量时,一个原创 2016-04-22 17:39:05 · 361 阅读 · 0 评论 -
Java并发之volatile二
使用volatile关键字的场景Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的原创 2016-04-22 18:07:31 · 1719 阅读 · 0 评论 -
Java并发之线程间协作Object的wait()、notify()、notifyAll()
wait()、notify()和notifyAll()是Object类中的方法:1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如原创 2016-04-22 23:03:15 · 2085 阅读 · 0 评论 -
java并发之Condtion在生产者消费者中的应用
public class Depot { private int depotSize; //仓库大小 private Lock lock; //独占锁 public Depot(){ depotSize = 0; lock = new ReentrantLock();转载 2016-04-27 22:33:31 · 1126 阅读 · 0 评论