并发学习05--多线程安全判断

本文探讨了Java中的线程安全问题,强调了HashTable的synchronized方法确保了线程安全,但组合使用时需注意线程同步。成员变量通常不安全,而局部变量安全。方法重写和抽象方法可能导致线程不安全,提及了String的不可变性保证了其在多线程环境下的安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.线程安全: 多个线程调用同一个实例的方法或变量时,是线程安全的。

HashTable里的put()方法是有synchronized关键字,所以是安全的。

HashTable ht = new Hashtable();
new Thread(()->{
    ht.put("test","1")
}).start();

new Thread(()->{
    ht.put("test1","1")
}).start();

2.HashTable,String,StringBuffer,Random,Vector, concurrent 是线程安全的。单个方法使用是线程安全的,但是其组合不一定是线程安全的

HashTable ht=new HashTable();
if(ht.get("key")==null) {
    ht.put("key","value");
}

//thread1: get==null
//thread2: get==null
//thread1: put()
//thread2: put()  这时thread2 put()的值会覆盖thread1的值。
//因此线程安全的类的方法组合不一定线程安全,需要给予控制

3.成员变量一般是不安全的。局部变量一般是安全的。

4.注意方法的重写导致线程不安全,可以将方法或类设置为private或者final增强安全性,使其不被暴漏出去。 故谨防“外星方法”--抽象方法

5.String里的split,substring都是拷贝了一个新副本存储新的值,并不是对原有的值进行改变。为不可变类线程安全--因为其内部方法都不可改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值