package com.neutron.t17;
import java.util.concurrent.TimeUnit;
/**
* ReentrantLock用于替代synchronized
* 案例中由于m1锁定this,只有m1执行完毕后,m2才能执行
* 复习synchronized最原始的语义
*/
public class T171 {
synchronized void m1() {
for (int i = 0; i < 10; i++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
synchronized void m2() {
System.out.println("m2.....");
}
public static void main(String[] args) {
T171 r1 = new T171();
new Thread(r1::m1).start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(r1::m2).start();
}
}
/**
* 目的是复习synchronized用法
*/
------------------------
package com.neutron.t17;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* ReentrantLock用于替代synchronized
* 案例中由于m1锁定this,只有m1执行完毕后,m2才能执行
* 复习synchronized最原始的语义
*
* 使用ReentrantLock可以完成同样功能
* 需要注意的内容是:必须手动释放锁。
* 使用synchronized如果遇到异常,jvm会自动释放锁;但是lock必须手动释放锁,因此常常在finally中释放锁
*/
public class T172 {
Lock lock = new ReentrantLock();
void m1() {
lock.lock(); // 相当于synchronized(this)
try {
for (int i = 0; i < 10; i++) {
System.out.println(i);
TimeUnit.SECONDS.sleep(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
void m2() {
lock.lock();
System.out.println("m2.....");
lock.unlock();
}
public static void main(String[] args) {
T172 r1 = new T172();
new Thread(r1::m1).start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(r1::m2).start();
}
}