JUC —— synchronized 的理解和实现

package com.pengshi.ThreadTest;

/**
 * @description: synchronized 的理解与简单实现 实现 线程A + 1操作 线程 B - 1操作
 * 要知道 synchronized 关键字 字词就是同步 ,其实就是同步操作,相当于对于本地只能有一个线程调用方法
 * 1.Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。
 * 2.Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。
 * 3.对于类锁synchronized static,是通过该类直接调用加类锁的方法,而对象锁是创建对象调用加对象锁的方法,两者访问是不冲突的,
 * 	对于同一类型锁锁住的方法,同一对象是无法同时访问的.
 *
 * 	下面使用的 是对象锁 ,直接使用this对象作为锁
 * 	其中我们 要知道 synchronized 的原理
 * 		其实就是使用对象头部进行设置,同时 利用对象监视器原理, 通过 对象头的设置 将对象头的值作为 锁,
 * 		利用wait 和 notify 进行加锁和解锁的操作 进行设计
 * 		所以说对象的设计 要 能够唯一,才能作为锁,不然可能导致线程安全
 *
 *
 * 	wait 方法的 虚假唤醒
 * 		就是唤醒时候 由于代码 还是由原来的地方执行,但是存在一个条件判断的问题,假如多线程抢占过程中,被其他线程唤醒后
 * 		它的条件其实是不满足的,但是使用if 判断后就不在判断了,所有解决方式就是使用 while 进行循环判断
 *
 * @projectName: Algorithm
 * @see: com.pengshi.ThreadTest
 * @author: pc
 * @createTime: 2022/2/25 23:31
 * @version: 1.0
 */
public class SynchronizedTest {
	private static int number = 0;
	public synchronized void add() throws InterruptedException {
		// 存在虚假唤醒
		while (number != 0) {
			this.wait();
		}
		number ++;
		System.out.println(Thread.currentThread().getName() + " :: " + number);
		this.notify();
	}
	public synchronized void decr() throws InterruptedException {
		while (number != 1) {
			this.wait();
		}
		number --;
		System.out.println(Thread.currentThread().getName() + " :: " + number);
		this.notify();
	}

	public static void main(String[] args) {
		SynchronizedTest synchronizedTest = new SynchronizedTest();
		new Thread(() -> {
			for (int i = 0; i < 10; ++i) {
				try {
					synchronizedTest.add();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, "A").start();

		new Thread(() -> {
			for (int i = 0; i < 10; ++i) {
				try {
					synchronizedTest.decr();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, "B").start();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pengshi12138

加油加油

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值