A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 。。。。。。。 中级黑马   /  2013-11-7 09:28  /  1135 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

用synchronized修饰的同步方法和synchronized同步代码块的区别是什么?

例如:
public  synchronized void show(){

}

synchrinozed(类名.class){

}

点评

这样的问题在百度上,也可以搜得到,请提高问题的质量  发表于 2013-11-7 14:49

3 个回复

倒序浏览
本帖最后由 青年黨衛軍 于 2013-11-7 10:59 编辑

1.synchronized修饰的同步方法
它是依靠对象锁锁定,当你在程序中初始化一个对象时,自动有一个对象锁。
synchronized {普通方法}依靠对象锁工作,多线程访问ynchronized方法,
一旦某个进程抢得锁之后,其他的进程只有排队对待。比如以下代码中,方式一和方式二是等效的。
  1. 方式一:public synchronized void method{}
  2. 方式二:
  3. void method
  4. {
  5.     {
  6.         synchronized(this)
  7.     }
  8. }
复制代码
2.synchronized同步代码块相比较而言,synchronized {修饰代码块}的作用不仅于此,synchronized void method{}整个函数加上synchronized块,效率并不好。在函数内部,可能我们需要同步的只是小部分共享数据,其他数据,可以自由访问,这时候我们可以用 synchronized(表达式){//语句}更加精确的控制。
synchronized修饰的同步方法和synchronized同步代码块的区别在毕老师的基础视频中多线程部分的卖票例子也有体现:
public void run()方法中两个while循环中,第一个while循环中使用了synchronized同步代码块,但不会影响第二个while循环的使用,而public static synchronized void show()方法则使用了synchronized修饰的同步方法,因为该方法体中所有的语句都需要同步。
  1. class TicketThread implements Runnable
  2. {
  3.         private static int ticket = 100;
  4.         //Object obj = new Object();
  5.         boolean flag = true;
  6.         public void run()
  7.         {
  8.                 if(flag)
  9.                 {
  10.                         while(true)
  11. {
  12.                                 synchronized(TicketThread.class)
  13.                                 {
  14.                                         if(ticket > 0)
  15.                                         {
  16.                                                 
  17.                                                 try {Thread.sleep(10);} catch (Exception e){e.printStackTrace();}
  18.                                                 System.out.println(Thread.currentThread().getName()+" selling... "+ticket--);
  19.                                         }
  20.                                 }
  21.                         }
  22.                 }
  23.                 else
  24.                 {
  25.                         while(true)
  26.                         {
  27.                                 this.show();
  28.                         }
  29.                                 
  30.                 }
  31.         }
  32.         
  33.         public static synchronized void show()//this
  34.         {
  35.                 if(ticket > 0)
  36.                 {
  37.                         
  38.                         try {Thread.sleep(10);} catch (Exception e){e.printStackTrace();}
  39.                         System.out.println(Thread.currentThread().getName()+" showing... "+ticket--);
  40.                 }
  41.         }
  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 很给力!

查看全部评分

回复 使用道具 举报
用synchronized修饰的同步方法和synchronized同步代码块的区别是什么?

第一,两者所用的锁不同 ,synchronized修饰的同步方法所用的锁是本类的对象锁 即this锁 ,而synchronized同步代码块的锁可以自定义
第二;控制范围,synchronized同步代码块可以自定义要同步的范围
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马