并发编程:线程同步基础:2、方法同步

本文详细探讨了Java中三种同步方法的实现(静态synchronized、实例synchronized和synchronized块),通过实例展示了它们在并发环境中的独立性和非互斥性。通过运行结果得出结论:这些锁方式互不影响,适用于不同场景。

目录

案例说明

一、主程序

二、执行结果

三、总结


案例说明

验证三种同步方式的独立性:

  1. 静态synchronized -> 类对象
  2. synchronized -> 实例对象(this)
  3. synchronized块 -> 参数对象

一、主程序

package xyz.jangle.thread.test.n2_2.synchonized;

import java.util.concurrent.TimeUnit;

/**
 * 
 *  同步方法,临界区同步的三种方式。
 *   从运行结果中可以看出,三种方式互不干扰,也说明他们不是互斥的,是不同的加锁方式。
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2021年1月28日 上午10:27:48
 * 
 */
public class M {

    private static final Object lock = new Object();

	public static void main(String[] args) {
		// 创建3个线程执行3个不同的方法。
		M m = new M();
		new Thread(() -> {
			m.test1();
		}).start();
		new Thread(() -> {
			M.test2();
		}).start();
		new Thread(() -> {
			m.test3();
		}).start();

	}

	/**
	 * 关联实例对象,即this,作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:34:36
	 */
	public synchronized void test1() {
		for (int i = 0; i < 10; i++) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("111111111111");
		}
	}

	/**
	 * 关联类对象,即Class对象,作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:36:49
	 */
	public static synchronized void test2() {
		for (int i = 0; i < 10; i++) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("2222222222222");
		}

	}

	/**
	 * 关联参数对象,即new Object(),作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:37:11
	 */
	public void test3() {
		synchronized (lock) {

			for (int i = 0; i < 10; i++) {
				try {
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("33333333333");
			}
		}
	}

}

二、执行结果

111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
2222222222222
33333333333
111111111111
2222222222222
33333333333
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
2222222222222
33333333333
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222

三、总结

从运行结果中可以看出,三种方式互不干扰,也说明他们不是互斥的,是不同的加锁方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值