关键字synchronized 的作用是实现线程间的同步,他的工作是对同步的代码加锁,使得每一次,只能有一个线程进入同步块,从而保证线程间的安全性。
关键字synchronized可以有多种用法。这里做简单的整理
a.指定加锁对象
b.直接作用于实例方法
c.直接作用于静态方法
用法很简单,这里就不举例说明了,下面列举一个很常见的错误同步用法
import java.util.Date;
public class SyncThreadTest implements Runnable {
public synchronized void sayHello(){
System.out.println("[" + new Date().getTime() + "]" + Thread.currentThread().getName() + ": say hello!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
while(true){
sayHello();
}
}
public static void main(String[] args){
Thread t1 = new Thread(new SyncThreadTest(),"test1");
Thread t2 = new Thread(new SyncThreadTest(),"test2");
t1.start();
t2.start();
}
}
可以看出两个线程指向了不同的Runable实例,换而言之,两个线程使用了两把不同的锁,因此无法保证线程安全。
但是我们只需简单的修改,就可以正确运行,那就是直接作用于静态方法,这样修改之后,两个线程请求的锁则变为当前类的锁,而非实例的锁。
public static synchronized void sayHello(){
System.out.println("[" + new Date().getTime() + "]" + Thread.currentThread().getName() + ": say hello!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}