java并发编程(二)多个线程多个锁

多个线程多个锁

多个线程多个锁:多个线程,每个线程都可以拿到自己制定的锁,分别获得锁之后,执行synchronized方法体的内容。就是在上次那个博客上说道的锁竞争的问题,是因为所有的线程过来以后都争抢同一个锁。如果说每个线程都可以或得到自己的锁,这样的话我们的锁竞争问题就没有了,如果这样做的话,我们去实例化一个对象,我们怎么可以保证多线程可以并行操作,并行操作完成之后又不会相互之间影响。最终的操作结果就是一样的,最简单的就是在类上面加上static,或者使用原子的方式,来避免锁竞争问题。

示例代码

package nihui.test.cn;

public class MutliThread {
	private static int num = 0;
	/** static */
	public static synchronized void printNum(String tag) {
		try {
			if (tag.equals("a")) {
				num = 100;
				System.out.println("tag a ,set num over");
				Thread.sleep(1000);
			} else {
				num = 200;
				System.out.println("tag b , set num over");
			}
			System.out.println("tag" + tag + "num" + num);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {		
		final MutliThread m1 = new MutliThread();
		final MutliThread m2 = new MutliThread();		
		Thread t1 = new Thread(new Runnable() {		
			@Override
			public void run() {
			    m1.printNum("a");
			}
		});		
		Thread t2  = new Thread(new Runnable() {			
			@Override
			public void run() {
				m2.printNum("b");				
			}
		});		
		t1.start();
		t2.start();	
	}
}

运行结果


示例总结:

关键字synchronized获取到的锁都是对象锁,而不是把一段代码(方法)当做锁,所以示例代码中那个线程先执行synchronized关键字的方法,那个线程就持有该方法所属的对象锁Lock,两个对象,线程获得就是两个不同的锁,他们互不影响。

有一种情况则是相同的锁,即在静态方法上夹上synchronized关键字,表示锁定.class 类,类一级别的锁(独占.class类)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nihui123

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值