ReentrantLock类是可重入.互斥.实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力.ReenreantLock类的常用方法有: ReentrantLock() : 创建一个ReentrantLock实例 ReentrantLock(boolean fair)  是否是公平锁,默认不是 [实际开发中 一般不开启公平] lock() : 获得锁 unlock() : 释放锁 下面代码演示 ReentrantLock 实现的累加器 p…
相同点: 两者都是可重入锁,同一个线程每进入一次,锁的计数器都自增1,等到锁的计数器下降为0时才能释放锁. 底层实现对比: Synchronized是依赖于JVM实现的,而ReentrantLock是JDK实现的. 性能对比: Synchronized优化以前,性能比ReenTrantLock差很多,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了. 在两种方法都可用的情况下,官方甚至建议使用synchronized. Synchronized的优化借鉴了…
读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低.所以在JDK中提供了一种读写锁ReentrantReadWriteLock,使用它可以加快运行效率. 读写锁表示两个锁,一个是读操作相关的锁,称为共享锁:另一个是写操作相关的锁,称为排他锁.我把这两个操作理解为三句话: 1.读和读之间不互斥,因为读操作不会有线程安全问题 2.写和…
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 Synchronized 原理 synchronized关键字是通过字节码指令来实现的 synchronized关键…
一.ReentrantLock 类   1.1 什么是reentrantlock   java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现.这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法.性能特性或者锁定语义. ReentrantLock 类实现了 Lock ,它拥有与 synchronized  相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些…
一.Synchronized(this)锁代码块 用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待.这种情况下就可以使用synchronized同步该方法中会引起线程安全的那部分代码,其余不会引起线程安全的就不需要同步,这部分代码就可以多线程并发执行,减少时间提高效率. 举例:多线程执行同一个方法时,同步方法和同步代码块花费时间的比较 1.synchronized修饰方法(同步方法) synchronized…
一.前言 在多线程中,有时会出现多个线程对同一个对象的变量进行并发访问的情形,如果不做正确的同步处理,那么产生的后果就是“脏读”,也就是获取到的数据其实是被修改过的. 二.引入Synchronized锁机制 本篇将通过以下实例代码来讲述synchronized锁机制 2.1 多线程安全问题实例 举例:两个线程分别获取不同的userName对应的num值. ThreadSynch类,不同的userName对应不同的num值,“zs”对应的num值是100,“ls”对应的num值是200 publi…
Java多线程 Java中,可运行的程序都是有一个或多个进程组成.进程则是由多个线程组成的.最简单的一个进程,会包括mian线程以及GC线程. 线程的状态 线程状态由以下一张网上图片来说明: 在图中,红框标识的部分方法,可以认为已过时,不再使用.(1)wait.notify.notifyAll是线程中通信可以使用的方法.线程中调用了wait方法,则进入阻塞状态,只有等另一个线程调用与wait同一个对象的notify方法.这里有个特殊的地方,调用wait或者notify,前提是需要获取锁,也就是说…
Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例 Java 同步关键字(synchronized) Java中的同步块用synchronized标记.同步块在Java中是同步在某个对象上.所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作.所有其他等待进入该同步块的线程将…
常用API method 注释 run() run()方法是我们创建线程时必须要实现的方法,但是实际上该方法只是一个普通方法,直接调用并没有开启线程的作用. start() start()方法作用为使该线程开始执行:Java虚拟机调用该线程的 run 方法. 但是该方法只能调用一次,如果线程已经启动将会抛出IllegalThreadStateException异常. yield() yield()方法让出CPU并且不会释放锁,让当前线程变为可运行状态,所以CPU下一次选择的线程仍可能是当前线程.…
线程安全 多个线程共同访问一个对象的实例变量,那么就可能出现线程不安全的问题. 先看一段代码示例,定义一个对象 MyDomain1 public class MyDomain1 { private int num = 0; public void addI(String username) { try { if (username.equals("a")) { num = 100; System.out.println("a set over!"); Thread.…
加锁和解锁 我们来看下ReentrantLock的基本用法 ThreadDomain35类 public class ThreadDomain35 { private Lock lock = new ReentrantLock(); public void testMethod() { try { lock.lock(); for (int i = 0; i < 2; i++) { System.out.println("ThreadName = " + Thread.curre…
Lock比传统的线程模型synchronized更多的面向对象的方式.锁和生活似,应该是一个对象.两个线程运行的代码片段要实现同步相互排斥的效果.它们必须用同一个Lock对象. 读写锁:分为读锁和写锁.多个读锁不相互排斥,读锁与写锁相互排斥,这是由jvm自己控制的,你仅仅要上好对应的锁就可以.假设你的代码仅仅读数据,能够非常多人同一时候读.但不能同一时候写,那就上读锁.假设你的代码改动数据.仅仅能有一个人在写.且不能同一时候读取,那就上写锁.总之.读的时候上读锁,写的时候上写锁! Reentra…
在多线程开发.除了synchronized这个keyword外,我们还通过Lock接口来实现这样的效果.由Lock接口来实现 这样的多线程加锁效果的优点是非常的灵活,我们不在须要对整个函数加锁,并且能够非常方便的把他放在我们函数的不论什么 一个地方,很的称心,并且从效率上来说.使用Lock接口要比使用synchronizedkeyword效率高一些,以下我们来使用 一个样例来说明这样的方法的使用. package com.bird.concursey.charpet3; public class…
一.synchronized基本原理 java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法. java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁,如果B线程不释放这个锁,那么A线程将永远等待下去. 二.基本规则 第一条: 当一个…
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用synchronized同步语句块来解决问题.看一下例子: public class ThreadDomain18 { public void doLongTimeTask() throws Exception { for (int i = 0; i < 100; i++) { System.out…
脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的. 多线程线程安全问题示例 看一段代码: public class ThreadDomain13 { private int num = 0; public void addNum(String userName) { try { if ("a".equals(userName)) {…
原文:http://www.cnblogs.com/skywang12345/p/3479202.html 1. synchronized原理在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,synchronized(obj)就获取了“obj这个对象”的同步锁.不同线程对同步锁的访问是互斥的.也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“…
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”. ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现锁的关键)来实现锁的获取与释放. 其可以完全替代 synchronized 关键字.JDK 5.0 早期版本,其性能远好于 synchronized,但 JDK 6.0 开始,JDK 对 synchronized 做了大量的优化,使得两者差距并不大. “独占”,就是在同一时刻只能有一个线程获取到锁,…
volatile是轻量级的synchronized,在多处理器(多线程)开发中保证了共享变量的"可见性".可见性表示当一个线程修改了一个共享变量时,另外一个线程能读到这个修改的值.正确的使用volatile,能比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度.使用时只需要把字段声明成volatile即可.   处理器实现,有volatile变量修饰的共享变量进行写操作的时候会出现LOCK前缀指令.触发两件事情,1.将当前处理器缓存行的数据写回到系统内…
概述 ReentrantReadWriteLock是Lock的另一种实现方式,ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程.写线程和写线程同时访问.相对于排他锁,提高了并发性.在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量. 所谓读写锁,是对访问资源共享锁和排斥锁,一般…
synchronized是用来解决多线程情况下的线程安全问题的,它可以修饰方法也可以修饰语句块 , 那么什么情况下是线程安全和线程不安全呢 ? 方法内的变量是线程安全的 , 类的实例变量是非线程安全的 首先来看一个非线程安全的例子 public class HasSefPrivateNum { private int num; public void addNum(String userName) throws InterruptedException{ if("a".equals(u…
synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法. synchronized的四种使用方式 修饰代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用于调用对象 修饰方法:被修饰的方法称为同步方法,其作用的范围是整个方法,作用于调用对象 注意:synchronized修饰方法时必须是显式调用,如果没有显式调用,例如子类重写该方法时没有显式加上synchronized,则不会有加锁效果. 修饰静态方法:其作用的范围是整个静态方法,作…
同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public class ThreadDomain25 { public synchronized static void printA() { try { System.out.println("线程名称为:" + Thread.currentThread().getName() + "在&…
场景描述 有一家很大的商场,在某市有几个商品配送中心,并有几家分店,这家商场经营很多的商品,平时运营情况是这样的: 根据各分店的商品销售情况,给分店配送相应需求量的商品:并上架到分店指让的位置,供客户选购. 客户选择自己需要的商品,然后到收银台交钱打包; 然后到一天的某个时候分店管理员(经理等),开始统计当前的销售情况,并计划向商品配送中心订购各商品的配送量: 场景模拟 1. 商场类; public class StoreMart { //商场这一天剩余的商品量 private static M…
0.概述 synchronized是Java提供的内置的锁机制,来实现代对码块的同步访问,称为内置锁(Intrinsic Lock) .内置锁包括两部分:一个是作为锁的对象的引用,另一个是由这个锁保护的代码块.需要理解的是,synchronized的锁都是对象的引用,同一个对象只有一个内置锁,不同的对象有不同的内置锁. Java 的内置锁是一种互斥锁,即一个对象的锁只能同时被一个线程持有.假设线程A尝试获取线程B持有的锁,线程A会被阻塞,知道B释放该锁,A才能持有该锁.如果线程B永远不是释放该锁…
同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public class ThreadDomain25 { public synchronized static void printA() { try { System.out.println("线程名称为:" + Thread.currentThread().getName() + "在&…
CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier.CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作.看一下CyclicBarrier的使用实例: public static class CyclicBarrierThread extends Thread { private CyclicBarrier cb; private int sleep…
先来看一个线程安全的例子 ,两个线程对count进行累加,共累加10万次. public class AddTest { public static void main(String[] args) { MyAddRunnable addRunnable = new MyAddRunnable(); Thread thread1 = new Thread(addRunnable); Thread thread2 = new Thread(addRunnable); thread1.start()…
一:锁的原理结构 (1)锁对象内部维护了一个同步管理器的对象AbstractQueuedSynchronizer,AbstractOwnableSynchronizer (2)该对象其实是一个抽象类,具体的锁的管理器继承该抽象类 (3)该抽象类的关键属性有:---->Thread exclusiveOwnerThread(获取锁的线程对象) ----> Node head(首节点,正在拥有当前锁的线程构造的Node对象) ---->Node tail(尾巴节点,等待获取锁的线程构造的双向…