【java技术总结】关于synchronized的使用

1|0Synchronized使用的三种方式:

  1. synchronized代码块-----可以指定任意对象,和synchronized方法联用要指向当前对象this
  2. synchronized方法-----this当前对象
  3. synchronized静态方法-----该类的字节码对象

 三种方法中2和3都可以用1来等价:

锁方法和锁静态方法分别相当于代码块锁当前对象和锁字节码对象,而代码块只需要指向相同的对象即可实现加锁

测试类:

public class SynSample { public static void main(String[] args) { Couplet couplet = new Couplet(); for (int i = 0; i < 10000; i++) { new Thread() { public void run() { int r = new Random().nextInt(2); if (r % 2 == 0) { couplet.first(); } else { couplet.second(); } } }.start(); } } }

 

1|11.synchronized代码块

需要指向同一对象

class Couplet { Object lock = new Object(); public void first() { synchronized (lock) { System.out.print("琴"); System.out.print("瑟"); System.out.print("琵"); System.out.print("琶"); System.out.println(); } } public void second() { synchronized (lock) { System.out.print("魑"); System.out.print("魅"); System.out.print("魍"); System.out.print("魉"); System.out.println(); } } }

1|22.synchronized方法

class Couplet { Object lock = new Object(); public synchronized void first() { System.out.print("琴"); System.out.print("瑟"); System.out.print("琵"); System.out.print("琶"); System.out.println(); } public synchronized void second() { System.out.print("魑"); System.out.print("魅"); System.out.print("魍"); System.out.print("魉"); System.out.println(); } }

 

两种混用

class Couplet { Object lock = new Object(); public synchronized void first() { System.out.print("琴"); System.out.print("瑟"); System.out.print("琵"); System.out.print("琶"); System.out.println(); } public void second() { synchronized (this) { System.out.print("魑"); System.out.print("魅"); System.out.print("魍"); System.out.print("魉"); System.out.println(); } } }

1|33.synchronized静态方法

测试类改静态调用:

public class SynSample { public static void main(String[] args) { Couplet couplet = new Couplet(); for (int i = 0; i < 10000; i++) { new Thread() { public void run() { int r = new Random().nextInt(2); if (r % 2 == 0) { Couplet.first(); } else { Couplet.second(); } } }.start(); } } }

 

class Couplet { Object lock = new Object(); public synchronized static void first() { System.out.print("琴"); System.out.print("瑟"); System.out.print("琵"); System.out.print("琶"); System.out.println(); } public synchronized static void second() { System.out.print("魑"); System.out.print("魅"); System.out.print("魍"); System.out.print("魉"); System.out.println(); } }

混用

class Couplet { Object lock = new Object(); public synchronized static void first() { System.out.print("琴"); System.out.print("瑟"); System.out.print("琵"); System.out.print("琶"); System.out.println(); } public static void second() { synchronized (Couplet.class) { System.out.print("魑"); System.out.print("魅"); System.out.print("魍"); System.out.print("魉"); System.out.println(); } } }

 


__EOF__

本文作者blanset
本文链接https://www.cnblogs.com/blanset/p/16774550.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   求道之愚者  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示