当多个线程操作统一成员变量或者静态变量, 在做写的操作时就会发送线程安全问题, 做读的操作不会发生线程安全问题. 防止线程安全问题可以使用同步代码块 (使用的时明锁), 同步函数 (使用的是 this 锁), 静态同步函数 (使用的字节码文件及类. class)
证明同步函数使用的 this 锁 一个线程使用同步代码, 一个线程使用同步函数, 如果使用的不是同一把锁则会发生线程安全问题
- package www.it.com.thread;
- /**
- * @author wangjie
- * @date 2019/11/21 11:42
- * @description 证明同步函数使用的是 this 锁 一个线程使用代码块, 一个使用同步函数
- * @company 石文软件有限公司
- */
- public class SynchronizedDemo implements Runnable {
- private Integer count = 100;
- private boolean flag = true;
- // 自定义锁
- private Object object = new Object();
- @Override
- public void run() {
- if (flag) {
- while (true) {
- synchronized (object) {
- if (count> 0) {
- try {
- Thread.sleep(40);
- } catch (Exception e) {
- }
- System.out.println(Thread.currentThread().getName() + ", 出售 第" + (100 - count + 1) + "张票.");
- count--;
- }
- }
- }
- } else {
- while (true) {
- sale();
- }
- }
- }
- public synchronized void sale() {
- if (count> 0) {
- try {
- Thread.sleep(40);
- } catch (Exception e) {
- }
- System.out.println(Thread.currentThread().getName() + ", 出售 第" + (100 - count + 1) + "张票.");
- count--;
- }
- }
- public static void main(String[] args) throws InterruptedException {
- SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
- Thread thread1 = new Thread(synchronizedDemo, "线程一");
- Thread thread2 = new Thread(synchronizedDemo, "线程二");
- thread1.start();
- Thread.sleep(100);
- synchronizedDemo.flag = false;
- thread2.start();
- }
- }
当同步代码块使用 object 锁时运行发生线性安全问题
将同步代码块变成 this 锁, 因为和同步函数使用的是同一把锁 this, 所以不会发生线程安全问题
来源: http://www.bubuko.com/infodetail-3339687.html