1.关键字 synchronized 取得的锁都是对象锁,而不是把一段代码或方法当做锁,所以在示例中,哪个线程先执行
printNum方法,哪个线程就获得该方法所属对象的锁,thread1运行时获取的是test1的锁,thread2运行时获取的时test2的锁。两个人锁互不影响。
如果在synchronized关键字前加上static修饰,那么这个锁表示锁定.class类,此时
thread1与thread2就需要竞争同一把锁。
示例:
public class JustTest{ private int anInt = 5; public synchronized void printNum(String tag){
try { if ("a".equals(tag)) { anInt = 100; System.out.println("tag a ,set num end"); Thread.sleep(1000); } else { anInt = 200; System.out.println("tag b ,set num end"); } System.out.println("tag ="+tag+", num="+anInt); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { final JustTest test1 = new JustTest(); final JustTest test2 = new JustTest(); Thread thread1 = new Thread(() -> test1.printNum("a")); Thread thread2 = new Thread(() -> test2.printNum("b")); thread1.start(); thread2.start(); } }
结果:
tag a ,set num end
tag b ,set num end
tag =b, num=200
tag =a, num=100