如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的, 而且其他的变量的值也和预期的是一样的,就是线程安全的。
通过一个案例,演示线程的安全问题:
电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “葫芦娃大战奥特曼”,本次电影的座位共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条)