synchronized和锁(ReentrantLock) 区别

java的两种同步方式, Synchronized与ReentrantLock的区别

并发(一):理解可重入锁

可重入锁和不可重入锁 ReentrantLock & synchronize

Java并发之ReentrantLock详解

 package mianshi.test;

 import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock; class ReentrantLockTest {
public static ReentrantLock reenT = new ReentrantLock();// 参数默认false,不公平锁
private ReentrantLock lock = new ReentrantLock(true); // 公平锁 速度慢与不公平锁 /**
* 使用场景:(1)比如一个定时任务,第一次定时任务未完成,重复发起了第二次,直接返回flase;
* (2)用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行
*/
public static void tryLockTest() {
if (reenT.tryLock()) {
// 如果已经被lock,则立即返回false不会等待,
// 达到忽略操作的效果 ,当执行1000线程时,有些未获得对象锁的线程,会自动跳过
try {
// 操作
System.out.println("aaaa" + Thread.currentThread().getName());
} finally {
reenT.unlock();
} }
} /**
* 使用场景:(1)同步操作 类似于synchronized 如果被其它资源锁定,会在此等待锁释放,达到暂停的效果
* ReentrantLock存在公平锁与非公平锁 而且synchronized都是公平的
*/
public static void lockTest() {
try {
reenT.lock(); // 如果被其它资源锁定,会在此等待锁释放,达到暂停的效果
// 操作
System.out.println("aaaa" + Thread.currentThread().getName()); } finally {
reenT.unlock();
}
} /**
* 使用场景:(1)如果发现该操作正在执行,等待一段时间,如果规定时间未得到锁,放弃。防止资源处理不当,线程队列溢出,出现死锁
*/
public static void trylockTimeTest() {
try {
if (reenT.tryLock(5, TimeUnit.SECONDS)) { // 如果已经被lock,尝试等待5s,看是否可以获得锁,如果5s后仍然无法获得锁则返回false继续执行
Thread.sleep(6000);
try {
// 操作
System.out.println("aaaa"
+ Thread.currentThread().getName());
} finally {
reenT.unlock();
}
}
System.out
.println("如果发现该操作正在执行,等待一段时间,如果规定时间未得到锁,放弃。防止资源处理不当,线程队列溢出,出现死锁");
} catch (InterruptedException e) {
e.printStackTrace(); // 当前线程被中断时(interrupt),会抛InterruptedException
} } /**
* 使用场景:(1)中断正在进行的操作立刻释放锁继续下一操作.比如 取消正在同步运行的操作,来防止不正常操作长时间占用造成的阻塞
*/
public static void lockInterruptTest() {
try {
reenT.lockInterruptibly();
System.out.println("aaaa" + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
reenT.unlock();
}
System.out.println("(1)中断正在进行的操作立刻释放锁继续下一操作.比如 取消正在同步运行的操作,来防止不正常操作长时间占用造成的阻塞");
} public void testlockInterruptTest() throws Exception {
final java.util.concurrent.locks.Lock lock = new ReentrantLock();
lock.lock();//长时间持有锁不释放,使用lockInterruptibly中断异常!!!
Thread.sleep(1000);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
/*try{
lock.lock();
System.out.println("不会中断");
}finally{
lock.unlock();
}*/
try {
lock.lockInterruptibly();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " interrupted.");
}
});
t1.start();
Thread.sleep(1000);
t1.interrupt();
} public static void main(String[] args) { for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
ReentrantLockTest.lockInterruptTest();
}
}).start();
} /*try {
ReentrantLockTest t = new ReentrantLockTest();
t.testlockInterruptTest();
} catch (Exception e) {
e.printStackTrace();
}*/
} }

synchronized和锁(ReentrantLock) 区别的更多相关文章

  1. 同步锁Synchronized与Lock的区别?

    synchronized与Lock两者区别: 1:Lock是一个接口,而Synchronized是关键字. 2:Synchronized会自动释放锁,而Lock必须手动释放锁. 3:Lock可以让等待 ...

  2. 深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同步方式.显式锁是JDK1.5引入的,这两种锁有什么异同呢? ...

  3. java synchronized和(ReentrantLock)区别

    原文:http://blog.csdn.net/zheng548/article/details/54426947 区别一:API层面 syschronized使用 synchronized即可修饰方 ...

  4. synchronized和ReentrantLock区别

    一.什么是sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默 ...

  5. Android进阶——多线程系列之wait、notify、sleep、join、yield、synchronized关键字、ReentrantLock锁

    多线程一直是初学者最困惑的地方,每次看到一篇文章,觉得很有难度,就马上叉掉,不看了,我以前也是这样过来的.后来,我发现这样的态度不行,知难而退,永远进步不了.于是,我狠下心来看完别人的博客,尽管很难但 ...

  6. synchronized关键字,Lock接口以及可重入锁ReentrantLock

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

  7. 深入分析ReentrantLock公平锁和非公平锁的区别

    在ReentrantLock中包含了公平锁和非公平锁两种锁,通过查看源码可以看到这两种锁都是继承自Sync,而Sync又继承自AbstractQueuedSynchronizer,而AbstractQ ...

  8. 深入分析ReentrantLock公平锁和非公平锁的区别 (转)

    在ReentrantLock中包含了公平锁和非公平锁两种锁,通过查看源码可以看到这两种锁都是继承自Sync,而Sync又继承自AbstractQueuedSynchronizer,而AbstractQ ...

  9. java8的ConcurrentHashMap为何放弃分段锁,为什么要使用CAS+Synchronized取代Segment+ReentrantLock

    原文地址:https://cloud.tencent.com/developer/article/1509556 推荐一篇 ConcurrentHashMap 和 HashMap 写的比较的的文章 j ...

随机推荐

  1. 记处理spring-devtools 和 通用mapper 使用问题

    问题: tk.mybatis.mapper.MapperException: 无法获取实体类com.*.* 对应的表名 环境: springboot 2.0.6, 通用mapper 2.0.4,还有 ...

  2. 《SQL 进阶教程》 查找局部不一致的数据

    -- 从下面这张商品表里找出价格相等的商品的组合 select * from products p1LEFT JOIN products p2on p1.price = p2.price and p1 ...

  3. 学习不一样的vue5:vuex(完结)

    学习不一样的vue5:vuex(完结)  发表于 2017-09-10 |  分类于 web前端|  |  阅读次数 4029 首先 首发博客: 我的博客 项目源码: 源码(喜欢请star) 项目预览 ...

  4. 劫后余生--New Start

    被搁置的计划 It was the best of times,it was the worst of times,it was the age of wisidom,it was the age o ...

  5. windows 10 遥控操作和传输文件

    传输文件命令 scp file user@192.168.1.1:/home/           file文件传到192.168.1.1/home/目录下 scp -r directory user ...

  6. VBS 脚本对象

    Dictionary对象(1) 1.        属性: a)        compareMode b)       count c)        key d)       item 2.    ...

  7. burpsuite下载安装及基本配置

    jdk安装 根据电脑安装对应jdk版本 点此下载jdk 下载完成得到如下exe文件 配置Java环境变量 计算机右键-->属性-->高级系统设置-->环境变量 点击环境变量--> ...

  8. Linux和云供应商Red Hat被IBM以34亿美元的价格收购

    导读 今天的主题包括IBM以340亿美元收购Red Hat,人性化是使人工智能成功的关键.两家公司于10月28日宣布,IBM正以340亿美元的价格收购Linux和云技术供应商Red Hat,以期改变云 ...

  9. storm正常任务数据量过大时造成定时任务不执行的问题

    在执行storm的定时任务时,发现storm普通任务数据量过大时造成定时任务不执行, 同时设置了storm的普通任务和定时任务,定时任务设置5秒执行1次. 普通任务的数据时从spout中不停发射字符串 ...

  10. for 循环遍历数据动态渲染html

    本案例通过ajax动态获取数据,然后遍历出数据渲染html小心踩坑:因为有时候不注意,渲染页面的时候只能输出最后一个数据所以正确写法为下:如果AJAX数据请求成功的情况下: html <div ...