线程安全问题的原因和解决方案

1.何为线程安全

很难去给线程安全去作出一个定义:

如果多线程环境下代码运行的结果是符合我们的预期的,与单线程环境下的结果一样,则说明这个线程是安全的

2.线程不安全的原因

线程的调度是随机的(这也是导致线程安全问题的罪魁祸首)

随机调度是一个程序在多线程环境下,执行顺序存在很多的变数

3.解决方案

synchronized关键字---监视器锁monitor lock

上⼀个线程解锁之后, 下⼀个线程并不是⽴即就能获取到锁. ⽽是要靠操作系统来 "唤醒". 这也就
是操作系统线程调度的⼀部分⼯作.
假设有 A B C 三个线程, 线程 A 先获取到锁, 然后 B 尝试获取锁, 然后 C 再尝试获取锁, 此时 B 和 C
都在阻塞队列中排队等待. 但是当 A 释放锁之后, 虽然 B ⽐ C 先来的, 但是 B 不⼀定就能获取到锁,
⽽是和 C 重新竞争, 并不遵守先来后到的规则.
*synchronized 的特性(不会将自己锁死)
1) 互斥
synchronized 会起到互斥效果, 某个线程执⾏到某个对象的 synchronized 中时, 其他线程如果也执⾏
到同⼀个对象 synchronized 就会阻塞等待.
进⼊ synchronized 修饰的代码块, 相当于 加锁
退出 synchronized 修饰的代码块, 相当于 解锁
一个线程先上了锁,其他线程只能等待这个线程释放
5.2 synchronized 使⽤⽰例
synchronized 本质上要修改指定对象的 "对象头". 从使⽤⻆度来看, synchronized 也势必要搭配⼀个
具体的对象来使⽤.
1) 修饰代码块: 明确指定锁哪个对象.
锁任意对象
public class SynchronizedDemo {
private Object locker = new Object();
public void method() {
synchronized (locker) {
                }
        }
}
锁当前对象
public class SynchronizedDemo {
        public void method() {
                synchronized (this) {
                }
        }
}
        
2) 直接修饰普通⽅法: 锁的 SynchronizedDemo 对象
public class SynchronizedDemo {
        public synchronized void methond() {
        }
}
3) 修饰静态⽅法: 锁的 SynchronizedDemo 类的对象
public class SynchronizedDemo {
        public synchronized static void method() {
        }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值