黑马程序员技术交流社区

标题: 简述synchronized和java.util.concurrent.locks.Lock的异同 ? [打印本页]

作者: 夏一站    时间: 2013-6-6 12:54
标题: 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

举例说明(对下面的题用lock进行了改写):
  1. package com.huawei.interview;



  2. import java.util.concurrent.locks.Lock;

  3. import java.util.concurrent.locks.ReentrantLock;



  4. public class ThreadTest {



  5.     /**

  6.      * @param args

  7.      */

  8.    

  9.     private int j;

  10.     private Lock lock = new ReentrantLock();

  11.     public static void main(String[] args) {

  12.        // TODO Auto-generated method stub

  13.        ThreadTest tt = new ThreadTest();

  14.        for(int i=0;i<2;i++)

  15.        {

  16.            new Thread(tt.new Adder()).start();

  17.            new Thread(tt.new Subtractor()).start();

  18.        }

  19.     }



  20.     private class Subtractor implements Runnable

  21.     {



  22.        @Override

  23.        public void run() {

  24.            // TODO Auto-generated method stub

  25.            while(true)

  26.            {

  27.               /*synchronized (ThreadTest.this) {      

  28.                   System.out.println("j--=" + j--);

  29.                   //这里抛异常了,锁能释放吗?

  30.               }*/

  31.               lock.lock();

  32.               try

  33.               {

  34.                   System.out.println("j--=" + j--);

  35.               }finally

  36.               {

  37.                   lock.unlock();

  38.               }

  39.            }

  40.         }

  41.       

  42.     }

  43.    

  44.     private class Adder implements Runnable

  45.     {



  46.        @Override

  47.        public void run() {

  48.            // TODO Auto-generated method stub

  49.            while(true)

  50.            {

  51.               /*synchronized (ThreadTest.this) {

  52.               System.out.println("j++=" + j++);

  53.               }*/

  54.               lock.lock();

  55.               try

  56.               {

  57.                   System.out.println("j++=" + j++);

  58.               }finally

  59.               {

  60.                   lock.unlock();

  61.               }            

  62.            }         

  63.        }

  64.       

  65.     }

  66. }

复制代码

作者: 曹睿翔    时间: 2013-6-8 13:18
顶一个!!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2