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