package cn.bufanli.test; /** * 关键字 synchronized 关键字取得的锁都是对象锁,而不是一段代码(方法) 当做锁 * 所以代码中哪个线程synchronized关键字的方法 哪个线程就持有该方法所属对象的锁(lock) *多线程多个锁:多个线程每个线程都可以拿到自己指定的锁.分别获得锁之后,执行synchronized方法体的内 *容 * 在静态方法上加synchronized 关键字,表示锁定.class类 类一级别的锁(独占.class类) * 类级别的锁:创建多个对象,多个对象持有的锁是1把; * 方法级别锁,创建多个对象,多个对象各持有1把锁 */ public class MultiThread { /** * 变量上加static 关键字保证数据的原子性 */ private static int num = 0; /** * 方法上加 static 是类锁 * @param tag */ private 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){ } } /** * 注意主函数run方法的执行顺序 * @param args */ public static void main(String[] args) { //两个不同的对象 MultiThread multiThread = new MultiThread(); MultiThread multiThread2 = new MultiThread(); Thread thread = new Thread(() -> { multiThread.printNum("a"); }); Thread thread2 = new Thread(() -> { multiThread2.printNum("b"); }); thread.start(); thread2.start(); /*Thread thread = new Thread(new Runnable() { @Override public void run(){ multiThread.printNum("a"); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run(){ multiThread2.printNum("b"); } }); thread.start(); thread2.start();*/ } }
