本帖最后由 王瀛 于 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接口的实例对象,并且是同一个,所以能够实现多线程同步
|