多个线程多个锁:多个线程都可以拿自己指定的锁,分别获得锁之后,执行synchronized方法题内容。
示例:
/** * 关键字synchronized获得的都是对象锁,而不是把一段代码(方法)当作锁, * 所以代码中哪个线程先执行synchronized关键字的方法,哪个对象持有该方法所属对象的锁 * @author Vision_TXG * */ public class MyThread02 { //注意加static和不加static的区别 private /*static*/ int num = 0; public /*static*/ synchronized void printNum(String tag) { try { if(tag.equals("a")) { num = 100; System.out.println("tag a"); Thread.sleep(1000); }else { num = 200; System.out.println("tag b"); } System.out.println("tag "+tag+" ,num = " + num); }catch(Exception e) { e.printStackTrace(); } } //注意观察run方法输出顺序 public static void main(String[] args) { final MyThread02 m1 = new MyThread02(); final MyThread02 m2 = new MyThread02(); Thread t1 = new Thread(new Runnable() {
@Override public void run() { // TODO Auto-generated method stub m1.printNum("a"); } }); Thread t2 = new Thread(new Runnable() {
@Override public void run() { // TODO Auto-generated method stub m2.printNum("b"); } }); t1.start(); t2.start(); } }
|
示例总结:关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当作锁,所以示例代码中哪个线程先执行synchronized关键字的方法,哪个线程就是持有该方法所属的对象锁,两个对象,线程获得的就是两个不同的锁,他们互不影响。
有一种情况则是相同的锁,即在静态方法上加synchronized关键字,表示锁定class类,类一级别的锁(独占class类)。