每天一例多线程[day3]-----synchronized与一个对象多个方法一把锁
发布日期:2021-06-30 13:44:58 浏览次数:2 分类:技术文章

本文共 1236 字,大约阅读时间需要 4 分钟。

package com.jeff.base.sync003;/** * 一个对象多个方法一把锁 *  * 对象锁的同步和异步问题  * @author jeff * */public class MyObject {	/**	 * 同步方法	 */	public synchronized void method1(){		try {			System.out.println(Thread.currentThread().getName());			Thread.sleep(4000);		} catch (InterruptedException e) {			e.printStackTrace();		}	}		/**	 *  异步方法 	 * */	public synchronized void method2(){			System.out.println(Thread.currentThread().getName());	}		public static void main(String[] args) {				final MyObject mo = new MyObject();				/**		 * 分析:		 * t1线程先持有mo对象的Lock锁,t2线程可以以异步的方式调用mo中的非synchronized修饰的方法,所以两个方法几乎同时执行打印结果。		 * 		 * t1线程先持有mo对象的Lock锁,t2线程如果在这个时候调用mo中的同步(synchronized)方法则需等待t1释放mo对象锁后才能执行method2同步方法打印结果。		 */		Thread t1 = new Thread(new Runnable() {			@Override			public void run() {				mo.method1();			}		},"t1");				Thread t2 = new Thread(new Runnable() {			@Override			public void run() {				mo.method2();			}		},"t2");				t1.start();		t2.start();			}	}

打印结果:

t1t2

 但是t2是在t1打印4s钟以后打印。原因就是t1和t2两个线程执行是同一个对象的不同方法,且这两个方法都加了对象锁synchronized,导致只有当一个线程释放锁后,另外一个线程才能执行,当t1获得锁后,进入方法打印t1,休眠4s,释放锁,t2之后获得锁,打印t2.

注意两个概念:

1 同步方法:加了synchronized的方法,存在锁竞争。

2 异步方法:不加synchronized的方法,不存在锁竞争。

如果我们把method2的synchronized去掉,打印结果依然是t1和t2,不同的是两者几乎是同时打印,不存在像同步一样的先后顺序。

转载地址:https://jeffsheng.blog.csdn.net/article/details/80556853 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:每天一例多线程[day4]-----使用synchronized避免DirtyRead
下一篇:每天一例多线程[day2]-----synchronized与多个线程多个锁

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年05月05日 03时55分34秒