黑马程序员技术交流社区
标题:
刚看完同步函数
[打印本页]
作者:
王瀛
时间:
2013-5-30 11:02
标题:
刚看完同步函数
本帖最后由 王瀛 于 2013-5-31 10:09 编辑
刚看完同步函数,一开始对于synchronized函数中隐藏的锁的对象是哪个还是不太明白。
后来没看源码自己重新敲了下卖票的例子。貌似懂了,写下来,
高手帮忙看看,我理解的对不对?
class Ticket implements Runnable
{
private int num = 50;
private boolean flag = true;
public boolean getFlag()
{
return this.flag;
}
public void setFlag(boolean fl)
{
this.flag = fl;
}
//Object obj = new Object();
public void run()
{
if (flag)
{
while (true)
{
synchronized(this)//<====================二、类中的成员是通过对象调用的,谁调用的它,this就代表谁。
{
if (num>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"代码块___正在出售第"+num--+"张票");
}
}
}
}
else
while (true)
{
show();
}
}
public synchronized void show()//<====================一、毕老师说:函数都有一个所属对象的引用,这个引用就是this,所以同步函数隐藏的锁是this
{
if (num>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"函数~~~~正在出售第"+num--+"张票");
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();//<====================三、这里创建了实现Runnable接口的实例对象,是唯一的
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);//<====================四、这里t1和t2对应的是两个线程对象,但是传入的Runnable接口实例都是同一个t
t1.start();//<====================五、两个线程对象分别调用了各自的start()方法,操作的是同一个Runnable接口实例对象
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
t.setFlag(false);
t2.start();
}
}
//综合三至五,得出一、二中的同步代码块的锁:this和同步函数隐藏的锁,指的都是实现了Runnable接口的实例对象,并且是同一个,所以能够实现多线程同步
复制代码
Ps:代码中注释的字有点儿小,粘贴下来了:
一、毕老师说:函数都有一个所属对象的引用,这个引用就是this,所以同步函数隐藏的锁是this;
二、类中的成员是通过对象调用的,谁调用的它,this就代表谁;
三、这里创建了实现Runnable接口的实例对象,是唯一的;
四、这里t1和t2对应的是两个线程对象,但是传入的Runnable接口实例都是同一个t;
五、两个线程对象分别调用了各自的start()方法,操作的是同一个Runnable接口实例对象;
综合三至五,得出一、二中的同步代码块的锁:this和同步函数隐藏的锁,指的都是实现了Runnable接口的实例对象,并且是同一个,所以能够实现多线程同步
作者:
神之梦
时间:
2013-5-30 20:36
个人认为,楼主的理解是正确的
只是觉得在主函数里面的那个try没必要写了,这里面的Tread.sleep(10);应该是让主线程睡觉,等主线程睡醒了,再开启t2,如果票少的话,
刚想让t2卖票,就会发现票已经让t1卖完了{:soso_e127:}
作者:
刘胜寒
时间:
2013-5-30 23:33
。。。。。。。。。。。。。。。。。。。。。飘过。
作者:
殇_心。
时间:
2013-5-31 10:07
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2