一、概述
1、Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。
二、代码描述
1、LockTest.java
/** * @Title: TraditionalThreadSynchronized.java * @Package com.lh.threadtest * @Description: TODO* @author Liu * @date 2018年1月15日 下午6:38:24 * @version V1.0 */package com.lh.threadtest.t10;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @ClassName: TraditionalThreadSynchronized * @Description: java5的线程锁技术 (对象锁必须保证唯一性,即保证线程互斥性)* @author Liu* @date 2018年1月15日 下午6:38:24 * */public class LockTest { /*** * @Title: main * @Description: TODO * @param @param args * @return void * @throws */ public static void main(String[] args) { new LockTest().init(); } private void init(){ final Outputer outputer = new Outputer(); new Thread(new Runnable() { public void run() { while(true){ try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("zhangsan"); } } }).start(); new Thread(new Runnable() { public void run() { while(true){ try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("lisi"); } } }).start(); } class Outputer{ //保证该锁的唯一性(同一个类中) Lock lock = new ReentrantLock(); //方法名前加synchronized关键字!对整个方法体加锁! public void output(String name){ lock.lock(); try{ for(int i = 0; i< name.length(); i++){ System.out.print(name.charAt(i)); } System.out.println(); //注意将释放锁代码放在finally块中,保证出现异常也能释放锁 }finally { lock.unlock(); } } }}
三、注意点
1、Lock对象锁的作用与传统synchronized类似。
2、注意将释放锁代码放在finally块中,保证出现异常也能释放锁。
3、Lock的一个实现类ReentrantLock。