synchronized关键字与reentrantlock
并发编程当中的锁----ReentrantLock
java中的锁可以实现多线程同步执行
多线程同步内部如何是实现的:
wait/notify,synchronized,ReentrantLock等
public class Test {
public static void main(String[] args) {
Thread t1 = new Thread() {
@Override
public void run() {
testsync();
}
};
t1.setName("t1");
Thread t2 = new Thread() {
@Override
public void run() {
testsync();
}
};
t2.setName("t2");
t1.start();
t2.start();
}
public static void testsync(){
System.out.println((Thread.currentThread().getName()));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
t1 、t2同时出现
package ReentrantLock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
static ReentrantLock reentrantLock = new ReentrantLock();
public static void main(String[] args) {
Thread t1 = new Thread() {
@Override
public void run() {
testsync();
}
};
t1.setName("t1");
Thread t2 = new Thread() {
@Override
public void run() {
testsync();
}
};
t2.setName("t2");
t1.start();
t2.start();
}
public static void testsync(){
reentrantLock.lock(); //上锁reentrantLock
System.out.println((Thread.currentThread().getName()));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
finally {
reentrantLock.unlock(); //释放锁,一般最后都加个finally,保证方法出现异常也能够释放
}
}
}
t1、t2不同时释放
为什么有synchronized还要用ReentrantLock?
jdk1.6之前没有ReentrantLock,先有synchronized
synchronized
重量级—1.6之前实现锁需要调用操作系统的函数(cpu切换为内核不能访问的资源,继续访问又变成用户态,有这种切换–变成了重量级),1.7之后不调用操作系统
区别1: 公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。ReentrantLock 支持对锁的公平性(fairness)控制, synchronized 关键字不支持公平性的控制。
构造函数 ReentrantLock(boolean fair) 可以通过参数 boolean 值指定锁是需要将所提供给等待时间最长的线程还是随机竞争获得所。
区别2: ReentrantLock 提供了一个很synchronized 关键字不具备的方法 tryLock() 。 该方法仅仅当锁未被其他线程占用的时, 才会获取锁, 这样可以减少同一时刻阻塞在同一个锁上的线程数量。
区别3: ReentrantLock 在锁定期间, 是可以被其他线程打断的 (interrupt), synchronized 关键词的线锁修饰的方法是可以被长期或一直阻塞。
区别3: 等待可中断。正在等待 ReentrantLock的线程是可以被中断的,而 synchronized 关键词则不具备这种能力。
区别4: ReentrantLock 还提供了获取所有等待锁线程的List 的方法
区别5: ReentrantLock 提供了条件变量Condition 的构造方法newCondition()