ciding 发表于 2013-2-3 10:27:42

多线程——锁(lock)

上一讲《多线程——同步(synchronized)下》
 
多线程——锁(lock)上
 
首先提出一个问题,synchronized与lock有哪些异同?是性能、适应范围、切入点?还是使用时的复杂度呢?
 
先了解一下java.util.concurrent.locks.Lock接口的实现类:ReentrantLock与ReentrantReadWriteLock的内部类中的ReadLock与WriteLock;分别叫重入锁,读入锁,写入锁。
 
而本节中主要讲ReentrantLock的使用与特性。
 
在ReentrantLock中有这样一段描述:
一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 (后面的先略过,需要的自己查看API。)
 
功能更强大? 编写思路:先通过一个例子看看实际效果,再分析ReentrantLock的lock()方法的实现方式,再比较synchronized的异同,最后得出两者的适用范围。
 
例子:
package thread_test;import java.util.concurrent.locks.ReentrantLock;/** * lock锁 ** @author ciding* @createTime Dec 14, 2011 9:54:03 AM * */public class LockThread {public static void main(String[] args) {Long t_start = System.currentTimeMillis();User_lock u = new User_lock("张三", 100);Thread_lock t1 = new Thread_lock("线程A", u, 20);Thread_lock t2 = new Thread_lock("线程B", u, -60);Thread_lock t3 = new Thread_lock("线程C", u, -80);Thread_lock t4 = new Thread_lock("线程D", u, -30);Thread_lock t5 = new Thread_lock("线程E", u, 100);Thread_lock t6 = new Thread_lock("线程F", u, 50);t1.start();t2.start();t3.start();t4.start();t5.start();t6.start();/** * 以下代码用于计算时间,当然,它本身的运行也会需要一点点时间,但与分析运行效率无影响 */boolean flag = true;while (flag) {if (Thread_lock.activeCount() == 1) {Long t_end = System.currentTimeMillis();System.out.println("当前时间:" + (t_end - t_start));flag = false;}}}}class Thread_lock extends Thread {private User_lock u;private int y = 0;Thread_lock(String name, User_lock u, int y) {super(name); // 线程的名称this.u = u;this.y = y;}public void run() {u.oper(y);}}class User_lock {private String code;private Integer cash;private ReentrantLock myLock1 = new ReentrantLock();private ReentrantLock myLock2 = new ReentrantLock();User_lock(String code, int cash) {this.code = code;this.cash = cash;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}/** * 业务方法 ** @param x *            添加x万元 */public synchronized void oper(int x) {try{Thread.sleep(1000);// 作用:增加运行时间this.cash += x;System.out.println(Thread.currentThread().getName() + "运行结束1,增加“"+ x + "”,当前用户信息:" + toString());} catch (InterruptedException e) {e.printStackTrace();}try{Thread.sleep(1000);// 作用:增加运行时间this.code = "张三(2)";} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic String toString() {return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}';}} 
<div class="quote_title">运行结果:
页: [1]
查看完整版本: 多线程——锁(lock)