简述synchronized和java.util.concurrent.locks.Lock的异同
源码来自一篇Java基础题 主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放(因为如果不在finally中释放的情况,当抛出异常时,线程直接死掉,但是没有释放锁,使得其他相关线程无法执行。读者可以试试在定义一个数组,并访问越界区,使得程序抛出异常,但是释放锁并未在finally中)。
源码例子:
Java代码
- package test.thread;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class TestLock {
- private int j;
- private Lock lock = new ReentrantLock();
- public static void main(String[] args) {
- TestLock tt = new TestLock();
- for (int i = 0; i < 2; i++) {
- new Thread(tt.new Adder()).start();
- new Thread(tt.new Subtractor()).start();
- }
- }
- private class Subtractor implements Runnable {
- @Override
- public void run() {
- for (int i = 0; i < 15; i++) {
- // 这里抛异常了,锁能释放吗?会释放,但是lock就不会释放,所以需要加上try..catch
- /*synchronized (TestLock.this) {
- System.out.println("j--=" +j--);
- }*/
- lock.lock();
- try {
- System.out.println("j--=" + j--);
- } finally {
- lock.unlock();
- }
- }
- }
- }
- private class Adder implements Runnable {
- @Override
- public void run() {
- for (int i = 0; i < 15; i++) {
- /*synchronized (TestLock.this) {
- System.out.println("j++="+j++);
- }*/
- lock.lock();
- try {
- System.out.println("j++=" + j++);
- } finally {
- lock.unlock();
- }
- }
- }
- }
- }