
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的, 而且其他的变量的值也和预期的是一样的,就是线程安全的。
通过一个案例,演示线程的安全问题:
电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “葫芦娃大战奥特曼”,本次电影的座位共100个(本场电影只能卖100张票)。
我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这100张票)
发现出现了两个问题:
- 相同的票数,比如5这张票被卖了两回。
- 不存在的票,比如0票与-1票,是不存在的。
这种问题,几个窗口(线程)票数不同步了,这种问题称为线程不安全。
1.2:线程同步(同步代码块) 1.3:同步方法:目标:线程同步_同步代码块
线程同步的作用:就是为了解决线程安全问题的方案。
线程同步解决线程安全问题的核心思想:
让多个线程实现先后依次访问共享资源,这样就解决了安全问题。
线程同步的做法:
是把共享资源进行上锁,每次只能一个线程进入访问完毕以后,其他线程才能进来。
线程同步的方式有三种:
(1)同步代码块。
(2)同步方法。
(3)lock显示锁。
b.同步方法
作用:把出现线程安全问题的核心方法给锁起来,
每次只能一个线程进入访问,其他线程必须在方法外面等待。
用法:直接给方法加上一个修饰符 synchronized.
原理: 同步方法的原理和同步代码块的底层原理其实是完全一样的,只是
同步方法是把整个方法的代码都锁起来的。
同步方法其实底层也是有锁对象的:
如果方法是实例方法:同步方法默认用this作为的锁对象。
如果方法是静态方法:同步方法默认用类名.class作为的锁对象。
1.4:Lock锁
目标:线程同步_同步代码块
线程同步的作用:就是为了解决线程安全问题的方案。
线程同步解决线程安全问题的核心思想:
让多个线程实现先后依次访问共享资源,这样就解决了安全问题。
线程同步的做法:
是把共享资源进行上锁,每次只能一个线程进入访问完毕以后,其他线程才能进来。
线程同步的方式有三种:
(1)同步代码块。
(2)同步方法。
(3)lock显示锁。
c.lock显示锁。
java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定 *** 作,
同步代码块/同步方法具有的功能Lock都有,除此之外更强大
Lock锁也称同步锁,加锁与释放锁方法化了,如下:
- `public void lock() `:加同步锁。
- `public void unlock()`:释放同步锁。
总结:
线程安全,性能差。
线程不安全性能好。假如开发中不会存在多线程安全问题,建议使用线程不安全的设计类。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)