我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > synchronized和java.util.concurrent.locks.Lock的异同
总共48087条微博

动态微博

查看: 1502|回复: 0

synchronized和java.util.concurrent.locks.Lock的异同

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-11-14 11:09:25 |只看该作者 |倒序浏览
主要相同点: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. }
复制代码





科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表