Synchronized 精讲 (2)

在这里插入图片描述

输出结果:线程 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(); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjdfy.html