author: bridge;
零散,记录未整理, 未完...
以下完全是学习之后的个人理解, 未必正确;;
在线程中有个锁的概念
当多个线程在运行时,
有时多个线程同一时刻会对一个对象同时进行读写;
这样可能造成脏读之类的问题;
那就是线程非安全
为了防止这些情况
有以下办法
synchronized(Object)
{
}
通过synchronized关键字;这样在这个代码片段里保证这个变量在这一时间点上只有当前线程能进行读写,其它线程只有进入等待,直到它这一代码段执行完才可以访问这个变量;
关于wait, notify;
当一个对象被锁时;其它线程想要访问这个有变量有两种情况
1.当这个变量解锁时, 即synchronized(Object){ ... }; 执行结束,离开了这个代码段, 那么这个变量就解锁; 其他线程便可以访问这个变量;
2.Object.wait; synchronized(Object){ ... } ; 当变量还在这个控制区内的,Object.wait, 那么此时正在等待的线程被唤醒,可以访问这个变量
Object.wait 的意思就是可以理解为暂停等待, 我先停下来不做事,代码执行此处,线程先挂起, 先把变量外借给其线程先用,等其它用完了, 线程再被唤醒,继续做我的事;
Ojbect.wait 有两个方法 1: Object.wait(); 2.Object.wait(Integer);
Object.wait():一直等待到别人告诉我,这个变量别人已用好了,我可以继续做事了;
也就是 Object.wait(); 我就开始睡觉了,一直等到别人叫我醒来, 我继续做事; 如没人叫你醒来,那你就得永远沉睡,挂了;死锁
那么如何叫醒呢; 就是通过 Object.notify(); 当借用给别的线程时, 在别的线程里 Object.notify; 就能唤醒当前线继续执行;
如果在当前线程 Object.wait; 而其它线程没有通过Object.nofity(); 就永远睡觉了;
Object.wait(Integer); 理解为睡觉时,定个闹种,到点自己醒,不管别人有没有用,或者用没有用完;; 继续我的事;
未完,,,有新的理解,继续更新;;