1、synchronize:同步代码块,同步方法
同步代码块:必须设置锁定的对象,一般使用this
如synchronized(this){...} //表示为该程序的逻辑上锁。
同步方法:public synchronized void sale(){...}
由于必须同步进行,所以执行速度回很慢
P.S:synchronized (this)和非static 的synchronized方法,只能防止多线程同时执行单一个对象,所以synchronized实质是锁对象。
解决方法:
(1)、锁同一个对象
(2)、全局锁,锁class类:
class sync{
public void test(){
synchronized(this.class){...}
}
}
总结:出现锁不住的原因其实是出现了多对象。拿门举例子,锁不住是因为系统直接造了三扇门(class对象),三扇门内各有一个进程。要想锁住,直接规定只让造一扇门synchronized(this.class)
2、Lock:由JDK1.5提供。
死锁形成的原因:成环。各个成立的条件互相耦合。A->B->C->A
有上锁就要解锁,lock()与unlock()相互配合
使用方法:程序名.lock(); 程序名.unlock(); 优先使用synchronized();
对象锁:当一个对象中有synchronized方法或synchronized block时调用此对象的同步方法或进入同步区域时,必须等待对象所释放。
全局锁:出现锁不住的原因其实是出现了多对象。拿门举例子,锁不住是因为系统直接造了三扇门(class对象),三扇门内各有一个进程。要想锁住,直接规定只让造一扇门synchronized(this.class)
1、wait():
作用:使线程停止运行
归类:object类方法
P.S:只能在同步方法或同步块中调用,如用wait()时候,没有适当的锁的话,就会跑出异常,执行wait();之后,会释放当前的线程的锁,由其余线程竞争获得锁。
进程如果不notify的话,则会一直等待下去。不会主动唤醒。
2、notify(): 作用:使停止的线程继续运行(与wait()相互配合使用)
(1)、要在同步方法或同步快中调用。
(2)、若同时有多个线程处于wait()状态,则notify随意挑一个程序唤醒。此随意由JVM决定。
(3)、nitify之后,不会马上释放该对象锁,会等待执行notify的同步代码走完之后,才会释放对象锁。
要想一次唤醒所有线程,则使用notifyAll();
P.S: 要注意notify方法的执行顺序必须在wait之后,不然的话wait程序遇不到notify命令则会一直等待下去。