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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nihui123/article/details/79687843

多个线程多个锁

多个线程多个锁:多个线程,每个线程都可以拿到自己制定的锁,分别获得锁之后,执行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类)

猜你喜欢

转载自blog.csdn.net/nihui123/article/details/79687843
今日推荐