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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 欧阳超 黑马帝   /  2011-10-5 22:55  /  3505 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁来解释一下

评分

参与人数 1技术分 +1 黑马币 +10 收起 理由
admin + 1 + 10 新人报到,加分加钱 鼓励,继续努力!.

查看全部评分

5 个回复

正序浏览
synchronized表示的就是锁。当一个方法上有synchronized时就表示这个方法在被一个线程执行时被锁上了,此时若其他线程也来执行这个方法,那么它看见这个方法被“上锁”了,自己就进不去了。只有当那个在执行这个方法线程“办完了事情”之后把锁打开自己出来后在等待的线程才可以进入这个方法。

评分

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

查看全部评分

回复 使用道具 举报
一个线程能否进入已有线程的方法分几种情况:

分几种情况:
     1.其他方法前是否加了synchronized关键字,如果没加,则能。
     2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
     3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
     4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 zhousaowen 于 2011-10-6 12:29 编辑

一个线程能否进入已有线程的方法分几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

synchronized使用地方及其使用的对象:
内部代码对象可以为this或者其他的对象:
public void  code(){
  Synchronized(this){}
}
在静态方法中的对象为字节码
public static synchroinized void code(){//xxxclass.class
}
在方法对象为this
public synchronized void code(){
}

评分

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

查看全部评分

回复 使用道具 举报
就是实现代码块的原子操作了  我是这么理解的  通过synchronized可以使  两个函数互斥访问临界资源  
回复 使用道具 举报
黑马网友  发表于 2011-10-5 23:18:12
沙发
同步的原理:
   其实就是使用锁机制。
   将多条操作共享资源的代码进行同步的封装,并加了锁。
   只有获取到锁线程才可以进入到同步中,这时其他线程即使获取到执行权。
   因为没有了锁,它们都进不来。这样就保证了数据的安全。解决了线程安全问题。
什么代码需要定义到同步中呢?
   只有操作了共享数据的多条代码才放到同步中。
   同步的好处:解决了线程安全问题。
   同步的弊端:对资源是一种耗费,相对降低效率。
同步的前提:
   1,必须是两个或者两个以上的线程才需要同步。
   2,多个线程必须使用同一个锁,才可以成为这些线程被同步了。
   解决思想:在一个时间段,对于多条执行共享资源的语句,必须由一个线程执行完。
   在执行过程中,其他线程不可以参与。
总结:造成安全隐患的因素
   1,多个线程在操作共享资源。
   2,有多条操作共享资源的代码。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马