synchronized放置位置问题

synchronized放置位置问题

为什么不能将synchronized放在Producer和Consumer类的run()方法中,如:

public synchronized void run() {

int i=0;

while(true) {

queue.setN(i++);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();


synchronized不是在有线程执行这个方法时,其它线程不可调用吗,按理应该也能达到一样的效果啊


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿慧 2020-08-19 16:24:29

同学你好,

1、在java中,使用synchronized来表示加锁标记,在方法中加上synchronized,表示当前方法在某个对象获取调用这个方法时,加上锁标记,不允许其他对象来调用这个方法。在一个线程调用该方法时,直到方法中的代码运行完,其它线程才能调用这个方法。

2、线程执行是根据获取到CPU时间片后就可以执行,当CPU时间片所在的时间片到期后,就可能被其他线程抢到CPU时间片执行线程。  所以线程运行是随机的,它并不是必须等线程1运行完了,再来运行线程2。

期间不是方法中的代码执行完,cpu才会切换给其他的线程使用,而是当CPU时间片到期后,当前线程会进入就绪状态,等待cpu再次分配时间片资源来继续执行方法中的代码。

3、同学可以参考下面的问答

https://class.imooc.com/course/qadetail/248977

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕阿慧 2020-08-19 11:49:33

同学你好,把synchronized加到了run方法上,不能实现同步操作。这是因为这两个run()方法不是同步的,执行Producer类中run方法时,也可能执行Consumer类中的run方法。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕沐1462760 #1
    关于synchronized还不是很了解,synchronized放在方法中,是不是代表在一个线程调用该方法时,直到方法中的代码运行完,其它线程才能调用?期间是不是也是方法中的代码执行完,cpu才会切换给其他的线程使用
    2020-08-19 15:19:37
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师