【java技术总结】关于synchronized的使用
Synchronized使用的三种方式:
- synchronized代码块-----可以指定任意对象,和synchronized方法联用要指向当前对象this
- synchronized方法-----this当前对象
- 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.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(); } } }
2.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(); } } }
3.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(); } } }
作者:blanset
出处:https://www.cnblogs.com/blanset/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号