前言:在上面的博客说了synchronized的一些用法,下面我们再来看看lock,这个出现频率也是非常高的一个。1:获取Lock锁的几种方式前面说了synchronized有锁对象和锁类对象,当某个线程获取锁其他线程必须等待执行完毕才可继续进行,比如线程A先获取锁,但是出现异常 ...
前言:在上面的博客说了synchronized的一些用法,下面我们再来看看lock,这个出现频率也是非常高的一个。
1:获取Lock锁的几种方式
前面说了synchronized有锁对象和锁类对象,当某个线程获取锁其他线程必须等待执行完毕才可继续进行,比如线程A先获取锁,但是出现异常导致的后果就是线程B无法获取锁,会出现死锁的情况(http://www.cnblogs.com/LipeiNet/p/6475851.html),那么我们一起看看Lock是如何解决的。lock有4种方式来获取锁
1:lock.lock() 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁。此种模式和synchronized一样但是不会出现死锁
public class Lock1 { static int value = 0; static Lock lock = new ReentrantLock(); static class Task1 implements Runnable { public void run() { System.out.println("线程" + Thread.currentThread().getName() + "开始执行"); lock.lock(); try { for (int i = 0; i < 1000000; i++) { value++; } System.out.println(value); } finally { lock.unlock(); } } } static class Task2 implements Runnable { public void run() { System.out.println("线程" + Thread.currentThread().getName() + "开始执行"); lock.lock(); try { for (int i = 0; i < 1000000; i++) { value++; } System.out.println(value); } finally { lock.unlock(); } } } public static void main(String[] args) { ExecutorService service= Executors.newCachedThreadPool(); service.execute(new Task1()); service.execute(new Task2()); service.shutdown(); }}
原标题:synchronized和lock比对
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。