输出结果:线程 t1 和线程 t2 执行形成了顺序,这种情况下和this没有什么区别,但是如果是多个同步代码块的话就需要进行自定义对象锁了
代码示例:多个同步代码块使用自定义对象锁,(两个自定义对象锁对应两个同步代码块)
输出结果:输出顺序线程t1 和线程t2 代码进行了交叉执行,出现了乱序
代码示例:多个同步代码块使用自定义对象锁,(一个自定义对象锁对应两个同步代码块)
输出结果:线程 t1 和线程 t2 执行形成了顺序
2.2 类锁特点:类锁只能在同一时间被一个对象拥有(无论有多少个实例想访问也是一个对象持有它)
2.2.1 synchronized修饰静态的方法
代码示例: synchronized 加在普通方法上面
public class SynchronizedDemo4 implements Runnable { private static SynchronizedDemo4 synchronizedInstance1 = new SynchronizedDemo4(); private static SynchronizedDemo4 synchronizedInstance2 = new SynchronizedDemo4(); public synchronized void method() { System.out.println("线程名称" + Thread.currentThread().getName()); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程名称" + Thread.currentThread().getName() + "运行完成"); } @Override public void run() { method(); } public static void main(String[] args) { Thread t1 = new Thread(synchronizedInstance1); t1.setName("我是线程 t1"); Thread t2 = new Thread(synchronizedInstance2); t2.setName("我是线程 t2"); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }输出结果:输出顺序线程t1 和线程t2 代码进行了交叉执行,出现了乱序
代码示例: synchronized 加在静态方法上面
public static synchronized void method();使用方式
public class SynchronizedDemo4 implements Runnable { private static SynchronizedDemo4 synchronizedInstance1 = new SynchronizedDemo4(); private static SynchronizedDemo4 synchronizedInstance2 = new SynchronizedDemo4(); public static synchronized void method() { System.out.println("线程名称" + Thread.currentThread().getName()); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程名称" + Thread.currentThread().getName() + "运行完成"); } @Override public void run() { method(); } public static void main(String[] args) { Thread t1 = new Thread(synchronizedInstance1); t1.setName("我是线程 t1"); Thread t2 = new Thread(synchronizedInstance2); t2.setName("我是线程 t2"); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }输出结果:线程 t1 和线程 t2 执行形成了顺序
2.2.2 指定锁对象为Class对象
代码示例:synchronized 加.class锁
synchronized (SynchronizedDemo5.class)
public class SynchronizedDemo5 implements Runnable { private static SynchronizedDemo5 synchronizedInstance1 = new SynchronizedDemo5(); private static SynchronizedDemo5 synchronizedInstance2 = new SynchronizedDemo5(); void method() { synchronized (SynchronizedDemo5.class) { //类锁只有一把 System.out.println("线程名称" + Thread.currentThread().getName()); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程名称" + Thread.currentThread().getName() + "运行完成"); } } @Override public void run() { method(); } public static void main(String[] args) { Thread t1 = new Thread(synchronizedInstance1); t1.setName("我是线程 t1"); Thread t2 = new Thread(synchronizedInstance2); t2.setName("我是线程 t2"); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }