只要有多个线程共享资源,都必须考虑同步,线程同步即是一种办法能够指定一个共享资源只能由一个线程独占访问来执行一个特定的语句序列
线程同步可以通过两种方案,一种是同步块,另一种是同步方法,来实现。
同步块
对System.out对象同步:
synchronized(System.out) {
System.out.print();
}
同步方法
对当前对象同步整个方法:
public synchronized void writeEntry(String message) throws IOException{
Date d = new Date();
out.write(message);
}
这种方法有三个不好:
①若将一个很大的方法声明为synchronized,VM(虚拟内存)性能会大大降低,代码速度会降低三分之一。
②增加死锁的可能性
③可能并不能保护真正想保护的对象,因为这种方案是对当前对象同步,即是对LogFile对象同步,而真正想做的是避免多个线程同时写入out,但刚刚好out是LogFile的一个私有实例变量,其他类想获取out必须通过LogFile。
同步的替代方法
有三种方案:
①使用局部变量,而不是字段
②使用线程安全的方法或者类
③把非线程安全的类用作线程安全的类的一个私有字段
死锁问题
当两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种现象称为死锁