synchronized和锁(ReentrantLock)区别
synchronized和锁(ReentrantLock) 区别
java的两种同步方式, Synchronized与ReentrantLock的区别
并发(一):理解可重入锁
可重入锁和不可重入锁 ReentrantLock & synchronize
Java并发之ReentrantLock详解
1package mianshi.test; 2 3import java.util.concurrent.TimeUnit;
4import java.util.concurrent.locks.ReentrantLock;
5
6class ReentrantLockTest {
7publicstatic ReentrantLock reenT = new ReentrantLock();// 参数默认false,不公平锁
8private ReentrantLock lock = new ReentrantLock(true); // 公平锁 速度慢与不公平锁
9
10/**
11 * 使用场景:(1)比如一个定时任务,第一次定时任务未完成,重复发起了第二次,直接返回flase;
12 * (2)用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行
13*/
14publicstaticvoid tryLockTest() {
15if (reenT.tryLock()) {
16// 如果已经被lock,则立即返回false不会等待,
17// 达到忽略操作的效果 ,当执行1000线程时,有些未获得对象锁的线程,会自动跳过
18try {
19// 操作
20 System.out.println("aaaa" + Thread.currentThread().getName());
21 } finally {
22 reenT.unlock();
23 }
24
25 }
26 }
27
28/**
29 * 使用场景:(1)同步操作 类似于synchronized 如果被其它资源锁定,会在此等待锁释放,达到暂停的效果
30 * ReentrantLock存在公平锁与非公平锁 而且synchronized都是公平的
31*/
32publicstaticvoid lockTest() {
33try {
34 reenT.lock(); // 如果被其它资源锁定,会在此等待锁释放,达到暂停的效果
35// 操作
36 System.out.println("aaaa" + Thread.currentThread().getName());
37
38 } finally {
39 reenT.unlock();
40 }
41 }
42
43/**
44 * 使用场景:(1)如果发现该操作正在执行,等待一段时间,如果规定时间未得到锁,放弃。防止资源处理不当,线程队列溢出,出现死锁
45*/
46publicstaticvoid trylockTimeTest() {
47try {
48if (reenT.tryLock(5, TimeUnit.SECONDS)) { // 如果已经被lock,尝试等待5s,看是否可以获得锁,如果5s后仍然无法获得锁则返回false继续执行
49 Thread.sleep(6000);
50try {
51// 操作
52 System.out.println("aaaa"
53 + Thread.currentThread().getName());
54 } finally {
55 reenT.unlock();
56 }
57 }
58 System.out
59 .println("如果发现该操作正在执行,等待一段时间,如果规定时间未得到锁,放弃。防止资源处理不当,线程队列溢出,出现死锁");
60 } catch (InterruptedException e) {
61 e.printStackTrace(); // 当前线程被中断时(interrupt),会抛InterruptedException
62 }
63
64 }
65
66/**
67 * 使用场景:(1)中断正在进行的操作立刻释放锁继续下一操作.比如 取消正在同步运行的操作,来防止不正常操作长时间占用造成的阻塞
68*/
69publicstaticvoid lockInterruptTest() {
70try {
71 reenT.lockInterruptibly();
72 System.out.println("aaaa" + Thread.currentThread().getName());
73 } catch (InterruptedException e) {
74 e.printStackTrace();
75 } finally {
76 reenT.unlock();
77 }
78 System.out.println("(1)中断正在进行的操作立刻释放锁继续下一操作.比如 取消正在同步运行的操作,来防止不正常操作长时间占用造成的阻塞");
79 }
80
81publicvoid testlockInterruptTest() throws Exception {
82final java.util.concurrent.locks.Lock lock = new ReentrantLock();
83 lock.lock();//长时间持有锁不释放,使用lockInterruptibly中断异常!!!
84 Thread.sleep(1000);
85 Thread t1 = new Thread(new Runnable() {
86 @Override
87publicvoid run() {
88/*try{
89 lock.lock();
90 System.out.println("不会中断");
91 }finally{
92 lock.unlock();
93 }*/
94try {
95 lock.lockInterruptibly();
96 } catch (InterruptedException e) {
97 e.printStackTrace();
98 }
99 System.out.println(Thread.currentThread().getName()
100 + " interrupted.");
101 }
102 });
103 t1.start();
104 Thread.sleep(1000);
105 t1.interrupt();
106 }
107
108publicstaticvoid main(String[] args) {
109
110for (int i = 0; i < 1000; i++) {
111new Thread(new Runnable() {
112publicvoid run() {
113 ReentrantLockTest.lockInterruptTest();
114 }
115 }).start();
116 }
117
118/*try {
119 ReentrantLockTest t = new ReentrantLockTest();
120 t.testlockInterruptTest();
121 } catch (Exception e) {
122 e.printStackTrace();
123 }*/
124 }
125
126 }
以上是 synchronized和锁(ReentrantLock)区别 的全部内容, 来源链接: utcz.com/z/508896.html