关于synchronized的问题

关于synchronized的问题

关于synchronized还不是很了解,synchronized放在方法中,是不是代表在一个线程调用该方法时,直到方法中的代码运行完,其它线程才能调用?期间是不是也是方法中的代码执行完,cpu才会切换给其他的线程使用

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

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

3回答
好帮手慕小尤 2020-08-20 11:50:00

同学你好,是可以的。线程同步可以这样理解,我们在超市中存包时,当一个柜子中存入东西时,就会把这儿柜门锁上,给出小纸条作为钥匙,此时其他人去开这个柜门,就不能打开,而当我们买完东西,使用小纸条打开柜门,取出东西后,这个柜子的锁就释放了!那这时别人再来打开这个柜子,就可以打开了!

    而在代码中使用的synchronized(this),当前对象(this)就相当于这个小纸条。只有当前的用户才可以进行操作,从而实现的同步。

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

好帮手慕小尤 2020-08-19 18:26:37

同学你好,1. 在代码中使用到了wait()方法,而此方法是中断方法的执行,使线程等待。

2. 同学提供的代码思路如下所示:

    当flag为false,getN()方法中,if(!flag)为true,消费的线程执行wait()方法,处于等待的状态。setN()方法中,if(flag)为false,不执行if条件,向下执行,输出生产XX,并设置flag = true;调用notify()方法(或notifyAll()方法),唤醒线程。

    再执行getN()方法,此时的flag为true,if(!flag)为false,不执行if条件,向下执行,输出消费XX,再设置flag 为false,以此循环。

从而实现线程同步。

3. 线程同步是通过synchronized()来实现的,在实现同步机制时,wait()与notify()需要与synchronized()一起使用,实现同步的效果!

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

  • 提问者 慕沐1462760 #1
    那在4-1的例题中,是没有使用wait、notify这些方法的,能实现同步吗? 4-1中方法saveAccount()用synchronized修饰,drawAccount()方法里的代码写在synchronized修饰的语句块里面,当一个线程执行完saveAccount()方法里的int balance=getBalance()时,cpu切换到另一线程,执行drawAccount()方法,那是不是同步不了了
    2020-08-20 09:30:49
好帮手慕小尤 2020-08-19 16:17:57

同学你好,1. 同学理解是正确的。当synchronized修饰一个方法时,一个线程调用该方法时,直到方法中的代码运行完,其它线程才能调用该方法。

2. 线程是可以同时运行多个的(cpu可以同时运行多个线程),所以当synchronized修饰的方法没有运行完毕时,并不会影响其他线程的运行。

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

  • 提问者 慕沐1462760 #1
    那在下面这个类中(5-1中的例题),当一个线程调用getN()方法,但这方法没执行完,此时cpu将时间片切换给另一个线程执行,另一个线程执行setN(int n)方法,那这样也起不到同步的作用啊 是不是加了synchronized修饰的方法,在一个线程调用这个方法时,在这个方法执行完毕前,这个方法所在的类的其他方法也不能被其他线程调用 public class Queue { private int n; boolean flag = false; public synchronized int getN() { if (!flag) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("消费:" + n); flag = false;// 消费完毕,容器中已经没有数据 notify(); return n; } public synchronized void setN(int n) { if (flag) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("生产:" + n); flag = true;// 生产完毕,容器中已经有数据 notify(); this.n = n; } }
    2020-08-19 16:30:15
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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