对线程和锁 和wait() notify()充满了很多的疑问, 先看我的理解:
1. 线程和线程对象的区别; 
实现了Runnable,看上去好像并不是代表这个类的实例就是线程对象; 因为它还要包装一层Thread();才能成为一个真正的线程对象。 (基于为何说实现了Runnable 接口就是一个线程对象的说法,不知何原因)。
.start() 才能确认启动了一个线程; 而一个Thread 只能启动一个start 线程; 根据一个判断来确定当前这个线程对象是否启动,启动之后, 这个线程无法再进行启动(因为已经启动了吗)。 启动的这条程序执行路径就称之为一个线程。 2. synchronized 关键字 ---- 到底是针对对象,还是针对线程,但有一点肯定的是跟线程对象基本没有关系。应该是跟线程跟对象或方法都有着相连的关系。 Synchronized(object):同步了这个对象,就相当于给这个object又加了一个名字(隐藏的安全机制), 告诉你 , 这个对象我在使呢, 上面有我名, 谁都不准动。 当然在方法 或静态方法中也是类似的情况, 只不过将权限扩大了而已。但绝对和线程对象没有关系。
3. wait(), notify() 方法是Object里,  
1. 或许有人问, 这是线程用的, 不放到线程里,干嘛放到Object里?。 
其实这个不难理解。 我们可以知道的是wait()是线程wait(), 感觉跟对象基本没有关系, 对象怎么wait()呀, 它又不是执行路径。之所以放在Object里, 我觉得跟synchronized有一定的关系, 大家都知道调用这两个方法,1.一定要在synchronized里, 但是这个锁对象持有的时候它只能持有一个,好比它的主人只能有一个,有多个那就乱了, 到底是谁的分不清了, 跟没锁一样了,无法进行同步了。所以是相互制约。
2. wait()要释放掉锁; 对象回归到自由身,别人又可以进行调用。或许有人问了,wait()干吗要synchronized呢?。 这是为线程而考虑的, 是将这把锁给线程的,这感觉有点反其道而行之的意思,原来是线程锁对象, 现在是对象锁线程,听着有点怪了吧!原来是一个线程可以控制到很多对象, 现在一个对象可以控制到很多线程, 比如说,一个线程wait()住了,那它跟对象脱离关系了, 一旦它醒来,又直接给这个对象上锁,因为它这个锁上还是有记号, 线程说:我虽然把你放了,那是因为制度的改革,但是呢, 我这个锁上还刻有你的名, 一旦体制恢复, 你还是我的,跑不掉的!(奴隶社会的体现啊!)。
3. notify() ;叫醒线程; 光听别人说自己叫不醒自己;不过不知道是不是自己叫醒自己的, 因为this.wait()还是用this.notify()来叫醒, 让人摸不着头脑。其实我到现在也是搞不清楚的, 因为这个this 是Object; 而不是线程, 到底是线程叫醒线程,还是对象叫醒线程呢?。而这个this 又是跟这个线程有着一把锁的关联。
当然我的理解是对象叫醒了线程,因为是this吗; 这个线程睡去了,它回归对象的自由身, 可是对象执行方法,发现条件不满足了,(体制又回到原来了), 大哭一声, 主人, 您收留我吧, 于是线程又把它给收了!

基于上面的理解呢,全是自己个人所想, 所以呢不知道究竟正确与否; 还请达人指点迷津; 也好皈依我佛, 当然如果觉得还有一些地方没有理解得道,还请补充,谢谢!

解决方案 »

  1.   

    ".start() 才能确认启动了一个线程; "  →  不是启动了,而是告诉cpu我准备好了,等待cpu为其处理,为就绪状态;要调用wait()方法,必须先锁定对象才能调用!
    wait() → 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。也就是说虽然当前线程等待了,但是该线程存在与该对象监视器上,一旦醒来,重新锁定该对象!
    notify()  →  唤醒在此对象监视器上等待的单个线程。
    notifyAll() → 唤醒在此对象监视器上等待的所有线程。
      

  2.   

    Java的线程是通过管程实现(monitor)的,具体机制请看<<Inside Java Virtual Machine>>
      

  3.   

    英文网址:http://www.artima.com/insidejvm/ed2/threadsynch.html