synchronized的弊端

9 篇文章 0 订阅

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(变量)来优化性能,它只保持括号内变量的线程安全

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值