多线程同步

只要有多个线程共享资源,都必须考虑同步,线程同步即是一种办法能够指定一个共享资源只能由一个线程独占访问来执行一个特定的语句序列

线程同步可以通过两种方案,一种是同步块,另一种是同步方法,来实现。

同步块

对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。

同步的替代方法

有三种方案:
①使用局部变量,而不是字段
②使用线程安全的方法或者类
③把非线程安全的类用作线程安全的类的一个私有字段

死锁问题

当两个线程在运行时都在等待对方的锁,这样便造成了程序的停滞,这种现象称为死锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值