随笔分类 - Java-JUC
摘要:一、锁对象及 synchronized 的使用 synchronized 通过互斥锁(Mutex Lock)来实现,同一时刻,只有获得锁的线程才可以执行锁内的代码。 锁对象分为两种: 实例对象(一个类有多个)和 Class 对象(一个类只有一个)。 不同锁对象之间的代码执行互不干扰,同一个类中加锁方
阅读全文
摘要:SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat实例对日期进行解析、格式化都会导致程序出错,接下来就讨论下它为何是线程不安全的,以及如何避免。 问题复现 编写测试代码如下:
阅读全文
摘要:问题分析:正如i在多线程中如果想实现i的多线程操作,必须i要使用volitle来保证其内存可见性,但是i++自增操作不具备原子性操作,因此需要对i++这段代码确保其原子性操作即可。 方案1: 使用ReetranLock实现i++的原子性操作。 方案2: 使用Semaphore实现i++的原子性操作。
阅读全文
摘要:方案(一)CountDownLatch: 使用CountDownLatch+Semaphore方式实现: 上边使用CountDownLatch+Semaphore方式实现,但是缺点:上边这种方式会导致线程阻塞情况。下边这种方案是可以实现不阻塞线程的用法: import java.util.concu
阅读全文
摘要:题目: 判断以下8种情况,输出的内容 题目一:一个Number实例对象number,两个非静态同步方法getOne,getTwo,两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出 输出结果: 题目二:一个Number实例对象number
阅读全文
摘要:问题: 有a、b、c三个线程,使得它们按照abc依次执行10次。 实现: 测试打印结果: 更多实现方案: 请参考《Java:现有线程T1/T2/T3,如何确保T1执行完成之后执行T2,T3在T2执行完成之后执行。》
阅读全文
摘要:Condition: condition接口描述了可能会与锁有关的条件变量。这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个lock可能与多个Condition对象关联。为了避免兼容性问题,Condition方法的名称与对应的objec版本中的不
阅读全文
摘要:模拟通过线程实现消费者和订阅者模式: 首先,定义一个店员:店员包含进货、卖货方法;其次,定义一个生产者,生产者负责给店员生产产品;再者,定义一个消费者,消费者负责从店员那里消费产品。 店员: 生产者 消费者 此时,运行程序,运行结果如下: 从运行打印结果可以发现这里存在两个问题: 1)一旦生产者发现
阅读全文
摘要:为什么要使用同步锁? 因为当使用多线程同时访问一个变量或对象时,如果这些线程中即有读又有写操作时,会造成导致变量或对象的状态出现混乱。例如:一个银行账户被A/B两个线程同时操作,A线程、B线程同时开始操作:A线程存款100,B线程取款100,此时就会出现账户存款100,然后查询存储结果为0,B取款失
阅读全文
摘要:Java创建线程的4种方式: Java使用Thread类代表线程,所有线程对象都必须是Thread类或者其子类的实例。Java可以用以下4种方式来创建线程: 1)继承Thread类创建线程; 2)实现Runnable接口创建线程; 3)实现Callable接口,通过FutureTask包装器来创建T
阅读全文
摘要:闭锁(CountDownLatch) jdk5.0在java.util.concurrent包中提供了CountDownLatch,它是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活
阅读全文
摘要:同步容器简介 针对容器我们知道有HashMap,HashTable,其中HashMap是一个非线程安全的,HashMap在并发执行put操作时会引起死循环,导致CPU利用率接近100%。因为多线程会导致HashMap的Node链表形成环形数据结构,一旦形成环形数据结构,Node的next节点永远不为
阅读全文
摘要:原子性 并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行。 可见性:当多个线程同时访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 有
阅读全文
摘要:1.Java HotSpot JVM运行时数据区 Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。 如果我们要想深入了解Java并发编程,就要先理解好J
阅读全文
摘要:问题背景: volatile是为了解决内存可见性而生的,什么是内存不可见性呢? 以下边的代码为例: 在线程thread开始执行的过程中会吧thread.flag属性值修改为true,一般情况下来说,main线程在while(true)循环内部是可以检测到thread.flag被修改了,而且我们希望是
阅读全文
摘要:要实现多个线程执行完成先后,就要知道如何实现线程之间的等待,java线程等待实现是join。java的jdk中join方法实现如下: 实现需求的方案一: 实现需求的方案二: 实现方案三:使用ReentrantLock来解决, 还有个state整数用来判断轮到谁执行了 使用lock来保证只有一个线程在
阅读全文