Java5并发库的锁位于java.util.concurrent.locks包,锁的做用很是相似于传统线程中的synchronizd(相关的例子能够参见http://020618.blog.51cto.com/6098149/1182775),与synchronizd相比,锁(lock)更加地面向对象,它主要用于互斥,与生活中的锁相似,锁自己也是一个对象,两个线程执行的代码片断要实现同步互斥的效果,他们必须用同一个Lock对象。锁是上在表明要操做的资源的类的内部方法中,而不是线程的代码中。下面经过代码看一下锁的简单使用。java
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class LockTest {
- public static void main(String[] args) {
- new LockTest().init();
- }
- private void init(){
- final Outputer outputer = new Outputer();
- new Thread(new Runnable(){
- @Override
- public void run() {
- while(true){
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- outputer.output("gaohao");
- }
- }
- }).start();
- new Thread(new Runnable(){
- @Override
- public void run() {
- while(true){
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- outputer.output("howdoyoudo");
- }
- }
- }).start();
- }
- static class Outputer{
- //定义一个锁对象,它是一个接口,new它的实现类
- Lock lock = new ReentrantLock();
- public void output(String name){
- int len = name.length();
- lock.lock();//一个线程进入的时候,锁上,其它的线程抢占同一个锁时,其它的线程不能进
- try{
- for(int i=0;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }finally{//必定会执行的代码
- lock.unlock();//正常或非正常退出,都应该把锁释放,不然会致使死锁
- }
- }
- //使用synchronized实现互斥的方法
- /*public synchronized void output2(String name){
- int len = name.length();
- for(int i=0;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }*/
- }
- }
程序运行的结果:并发
能够看到,利用锁(Lock)一样实现互斥的效果,两个线程不断的打印两条完整的信息,他们彼此不会被对方打断。ide