synchronized能解决线程安全问题大家都知道,大多数线程问题也都是他解决的,但是他有一个致命的弊端,就是慢
synchronized标记的方法是按顺序执行的,如下代码
public class demo1 extends Thread{
@Override
synchronized public void run() {
try {
System.out.println(Thread.currentThread().getName()+"开始");
sleep(5000); //用休眠表示重要操作
System.out.println(Thread.currentThread().getName()+"结束");
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
demo1 demo=new demo1();
Thread d1=new Thread(demo);
Thread d2=new Thread(demo);
d1.start();
d2.start();
}
}
可以看出synchronized是按顺序执行,d1没有执行完,d2是不能执行的,而加了synchronized后的执行时间必定是20秒(1次休眠时间是5秒)
而不加synchronized,它的执行时间应该是10秒,(实际要多上几毫秒,忽略不计),因为不加synchronized后d1和d2是同步执行的,互不影响吧。
因此使用synchronized时其实我们要仔细,自己的代码是否需要线程安全,synchronized是加给变量还是方法都需要认真考虑。
另外我们可以使用synchronized(变量)来优化性能,它只保持括号内变量的线程安全