synchronized的使用
1.使用对象锁
方法拥有对象级别的锁,多个线程使用同一个对象的这个方法时,只有一个线程可以使用该方法,如果每个线程使用的都是新建的对象,则不会发生同步。
类可以创建很多对象,每个对象都是自己的动态方法同步代码块的锁
例如:
使用对象锁的方法:
1)
public synchronized void test1(){
}
2)
public void test2(){
synchronized(this){
}
}
3)
private Object lock = new Object();
public void test3(){
synchronized(lock){
}
}
2.使用类锁
方法拥有类级别的锁,多个线程使用同一个类的对象的该方法时,只有一个线程可以使用这个方法。
使用类锁的方法:
1)
public static synchronized void test4(){
}
2)
public void test5(){
synchronized(this.getClass()){
//somecode
}
}
线程控制
1.Object.wait()
把该对象锁的控制权交出去,本线程处于等待状态,直到该对象锁的控权线程执行了notify()方法并使用完这个对象锁后。使用这个方法的线程必须拥有这个对象的锁
2.Object.notify()
通知某个等待本对象锁的线程可以继续执行,当本线程执行完该同步锁本次控制的方法后。使用这个方法的线程必须拥有这个对象的锁
3.Object.notifyAll()
与notify()相同,不同的地方是会通知所有等待本对象锁的线程。使用这个方法的线程必须拥有这个对象的锁
4.Thread.sleep()
使当前线程暂停一段时间,与Object.wait()不同的是,这个方法不会交出对象锁的控制权。