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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2012 中级黑马   /  2013-9-17 13:04  /  1390 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-19 12:25 编辑

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
我在网上也查过一些资料,这好像是常见的面试题,还是非常的模糊。
那位大神能帮我分析分析。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

7 个回复

倒序浏览
调用对象的其他非同步修饰的方法 是可以的。有了Synchroniized修饰就是给这个方法安了个锁,没钥匙就进不去。但是其他方法没有安锁当然在权限下是可以访问的。(指没被private)

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报
1》synchronized 中锁住了该对象, 该对象中的其他方法有没有使用一样的锁,
如果其他方法都使用同样的锁,那么则其他线程不能访问使用相同锁的其他方法。
2》如果该对象的其他方法没有使用同步,或者使用了同步但锁不是相同的锁,那么其他线程
则可以访问该对象的其他方法。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1,线程的运行是通过获取cpu的执行权来执行,任何时候只有一个线程在运行(多核除外)。
2,一个线程运行的任何时期,cpu都有可能将执行权切换到其他线程上去。对于线程中有些代码在执行过程中不能被中途打断,需要一次性执行完的代码,就可以使用synchronized(同步代码块)或者同步函数来进行处理。被synchronized修饰的代码必须要执行完之后才有机会被其他线程切换掉cpu执行权。就相当于被synchronized修饰的代码具有一个锁或者一个监视器,只有拿到这个锁或者监视器才会执行他里面的代码。
3,没有被synchronized修饰的其他代码自然使可以被执行的,或者同步函数和同步代码块的锁不同,也能被执行。
4,简单一句话:synchronized只是为了保证某一段代码的一次性顺利顺利执行而设计。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1 很给力!

查看全部评分

回复 使用道具 举报
不能,一个对象的一个synchronized方法只能由一个线程访问。
回复 使用道具 举报
不能,被synchronized修饰方法只能由一个线程访问,结束后才允许另一个线程进入,另外也可以使用this来保证方法只有一个线程来访问
回复 使用道具 举报
  1. /*
  2. * 第一种情况结果类似如下:
  3. * Thread-0~~run
  4. * Thread-0~~show
  5. * Thread-1~~run
  6. * Thread-1~~show
  7. * 第二种情况结果类似如下:(大部分结果和第一种情况一样,这里写一下标示的地方CPU切出去的情况下)
  8. * Thread-0~~run
  9. * Thread-1~~run
  10. * Thread-0~~show
  11. * Thread-1~~show
  12. * 第三种情况结果类似如下:
  13. * Thread-0~~show
  14. * Thread-1~~show
  15. * Thread-0~~run
  16. * Thread-1~~run
  17. */
  18. public class SynchronizedDemo {

  19.         public static void main(String[] args) {
  20.                 // TODO Auto-generated method stub
  21.                 MyThread mt = new MyThread();
  22.                 Thread t1 = new Thread(mt);
  23.                 Thread t2 = new Thread(mt);
  24.                 t1.start();
  25.                 t2.start();
  26.         }

  27. }
  28. class MyThread implements Runnable
  29. {
  30.         public void run()
  31.         {       
  32.                 show(); //第三种情况:没有锁的限制,所以线程进来就可执行
  33.                 synchronized (MyThread.class)
  34.                 {       
  35.                         System.out.println(Thread.currentThread().getName()+"~~run");
  36.                         //show(); //第一种情况:当前线程执行完后下个线程才能执行
  37.                 }
  38.                 //CPU有可能切出去
  39.                 //show(); //第二种情况:至少等当前线程执行完锁中的内容,第二个线程进来也执行完锁里的内容才能执行到这个方法
  40.         }
  41.         void show()
  42.         {
  43.                 System.out.println(Thread.currentThread().getName()+"~~show");
  44.         }
  45. }
复制代码
三种情况我已经写在注释中,一个线程进入锁后另一个线程到底能否调用对象中其他方法还的看代码环境决定

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
楼主,你好!
如果您的问题解决了,请把您问题的未解决更改为已解决
谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马