java并发编程
文章平均质量分 90
Autumn匆
这个作者很懒,什么都没留下…
展开
-
Lock
一,synchronized的缺陷如果一个代码块被synchronized修饰,当一个线程获取了对应的锁,并执行该代码块,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况1.获取锁的线程执行完该代码块,然后线程释放对锁的占有2.线程执行发生异常,此时JVM会让线程自动释放锁那么如果这个获取锁的线程由于要等待IO或者其他原因被阻塞了,但是又没有释...原创 2018-06-29 15:27:51 · 249 阅读 · 0 评论 -
队列同步器AbstractQueuedSynchronizer(AQS)
同步器的设计是基于模板方法模式的,即使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法会调用使用者重写的方法先看下类的定义:public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer imple...原创 2018-08-15 20:27:37 · 287 阅读 · 0 评论 -
ConcurrentHashMap
JDK1.7的实现ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成,如图:Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,segment的结构和HashMap类似,是一种数组和链表的结构,一个segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,每个segment...原创 2018-07-24 22:57:11 · 629 阅读 · 0 评论 -
java中的原子操作Atomic
Atomic简介Atomic包是java.util.concurrent下的另一个专门为线程安全设计的Java包,包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一...转载 2018-07-25 16:24:55 · 707 阅读 · 0 评论 -
漫谈CAS机制
示例程序:启动两个线程,每个线程中让静态变量count循环累加100次。最终输出的count结果是什么呢?一定会是200吗?加了同步锁之后,count自增的操作变成了原子性操作,所以最终的输出一定是count=200,代码实现了线程安全。所谓原子操作类,指的是java.util.concurrent.atomic包下,一系...转载 2018-07-25 11:31:37 · 309 阅读 · 0 评论 -
锁的优化
对于单任务或者单线程的应用程序而言,主要资源消耗都花在任务本身,它既不需要维护并行数据结构间的一致性,也不需要为线程的切换和调度花费时间。但对于多线程的应用来说,系统出了处理功能需求外,还需要额外维护多线程环境的特有信息,如线程本身的元数据、线程的调度、线程上下文的切换等。在高并发环境下,激烈的锁今早会导致程序性能下降,自然有必要讨论一些有关锁的性能问题以及相关的一些注意事项一,有助于提高锁性能的...原创 2018-07-07 11:17:59 · 242 阅读 · 0 评论 -
java写一个线程安全的单例模式Singleton
1.饿汉式单例指在方法调用前,实例就已经创建好了package jichu;public class Singleton { private static Singleton instance=new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return i...转载 2018-07-18 15:05:01 · 8934 阅读 · 0 评论 -
线程通信简单实例
1.Object类的wait()、notify()和notifyAll(),必需由同步监视器对象来调用wait(),导致当前线程等待,直到其他线程调用该同步监视器的notify()或notifyAll()来唤醒该线程,调用该方法的当前线程会释放对该同步监视器的锁定 notify(),唤醒在此同步监视器上等待的单个线程,如果所有线程都在该同步监视器上等待,则会选择唤醒其中一个,选择是任意性的,...原创 2018-07-18 13:15:30 · 627 阅读 · 0 评论 -
概念解析-死锁&饥饿&活锁
1.死锁:通俗地说,死锁是两个或者多个线程,相互占用对方需要的资源,而都不进行释放,导致彼此之间都相互等待对方释放资源,产生了无限制等待的现象,死锁一旦发生,如果没有外力介入,这种等待将永远存在,从而对程序产生严重的影响用来描述死锁的一个有名的场景是“哲学家就餐”问题,用一个简单的例子来模拟下,有两个科学家和两把叉子package LockTest;public class DeadLock ...原创 2018-07-05 16:38:21 · 1050 阅读 · 0 评论 -
volatile
这篇博客总结得很好,以后看到了再更新。。。http://www.cnblogs.com/dolphin0520/p/3923737.html转载 2018-06-29 10:24:45 · 210 阅读 · 0 评论 -
synchronized
1.什么时候会出现线程安全问题?如何解决?在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的资源,eg,一个变量、一个对象、一个文件、一个数据库表等, 而多个线程同时访问同一个资源的时候,就会存在一个问题,即,由于每个线程执行的过程是不可控的,所以很可能导致的组中结果与实际上的愿望相违背或者直接导致程序出错。基本上所有的并发模式在解决线...原创 2018-06-29 10:22:30 · 240 阅读 · 0 评论 -
线程池的使用
多线程软件设计方法确实可以最大限度地发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能,但是,若不加控制和管理随意使用线程,对系统的性能反而会产生不利影响首先,线程的创建和关闭依然需要花费时间,如果为每一个小的任务都创建一个线程,很有可能出现创建和销毁线程所占用的时间大于该线程真实工作所消耗的时间的情况;其次,线程本身也要占用内存空间的,大量的线程会抢占宝贵的内存资源,如果处理不当,可能...原创 2018-07-26 21:38:34 · 440 阅读 · 0 评论 -
ThreadLocal
原文地址:点击打开链接,中间内容有些自己学习时的笔记。。。一,两个问题1.什么是ThreadLocal?ThreadLocal类可以理解为线程本地变量,即如果定义了一个ThreadLocal,每个线程往这个ThreadLocal中读写是线程隔离的,互相之间不会影响的,它提供了一种将可变数据通过每个线程有自己的独立副本从而实现线程封闭的机制2.实现的大致思路每个线程内部会维护一个...转载 2018-06-30 11:23:35 · 221 阅读 · 0 评论 -
再看Lock
之前有对Lock接口做过简单介绍,Lock接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的,学习了AQS之后,再次来看Lock,内容主要摘自《Java并发编程的艺术》重入锁重入锁ReentrantLock,即支持重进入的锁,表示该锁能支持一个线程对资源的重复加锁,该锁还支持获取锁时的公平和非公平的选择1.实现重进入重进入指任意线程在获取到锁之后能够再次获取该锁而不会...原创 2018-08-19 16:54:43 · 295 阅读 · 0 评论