博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内部锁(synchronized)中类锁和对象锁
阅读量:4186 次
发布时间:2019-05-26

本文共 2253 字,大约阅读时间需要 7 分钟。

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_25827845/article/details/77688880

       synchronized是Java提供的内部锁,里边有类锁和对象锁;在静态方法中,我们一般使用类锁,在实例方法中,我们一般使用对象锁,接下来,分析类锁和对象锁的区别和联系。

1、两个同步块使用同一个对象锁:

public class Main {    static Main objMain = new Main();    public static void main(String[] args) {        new Thread(new Runnable() {                        @Override            public void run() {                Main.method2();                            }        }).start();        new Thread(new Runnable() {                        @Override            public void run() {                Main obj = new Main();                obj.method();                            }        }).start();    }   public static void method2() {       synchronized (objMain) {                System.out.println("method2......");        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("method2....666..");    }   }      public void method(){       synchronized (objMain) {        System.out.println("method...");    }   } }

我们在main方法中启动两个线程,分别执行method2和method方法;结果显示,当前输入在method2先占有对象锁之后,method方法内部将得不到该objMain对象锁,直到method2中执行结束。method方法中才会执行同步块。

说明:两个不同的线程在抢占同一个对象锁。

2、如果我们让两个同步块一个使用类锁一个使用对象锁:

public class Main {	static Main objMain = new Main();	public static void main(String[] args) {		new Thread(new Runnable() {						@Override			public void run() {				Main.method2();							}		}).start();		new Thread(new Runnable() {						@Override			public void run() {				Main obj = new Main();				obj.method();							}		}).start();	}   public static void method2() {       synchronized (Main.class) {				System.out.println("method2......");		try {			Thread.sleep(2000);		} catch (InterruptedException e) {			e.printStackTrace();		}		System.out.println("method2....666..");	}   }      public void method(){	   synchronized (objMain) {		System.out.println("method...");	}   } }

此时,并不会出现锁互斥的现象,即不同的线程之间没有锁的争用。

3、如果我们将同步块中的锁均设置为类锁,即Main.class 

此时,情况和1中一样,两个线程争用锁,一个没有释放锁,另一个线程的同步块将不会被执行。(因为此时两个线程使用了同一个类锁Main.class)

4、两个同步块中使用不同的类锁,比如一个为Main.class,另一个为Object.class。

此时,是两把不同的类锁,不会导致线程之间的锁争用,即自己执行自己的同步块即可。

5、同理,两个同步块中使用不同的对象锁,也不会导致锁争用,线程之间相互独立执行。

以上就是对synchronized中类锁和对象锁的理解,以及什么情况下会导致线程之间对锁发生争用

你可能感兴趣的文章
verdi编译vhdl文件时,报出"warning:*Warn* Unknown argument –vhdl08"的解决 办法
查看>>
linux 常见命令总结
查看>>
信号差分对的优势说明
查看>>
verilog timescale的两种仿真处理方法
查看>>
lattice FPGA 使用指南2 - DDR3 sdram controller IP配置注意事项
查看>>
何谓“pessimistic”异步FIFO的full和empty信号
查看>>
*Error* illegal LHS in continous assignment
查看>>
Cadence IUS 之一:简介
查看>>
在gvim中使用Emacs verilog mode的verilog代码自动插入和自动插入撤销的方法。
查看>>
Emacs Verilog mode 简单使用指南
查看>>
AXI 总线基本概念1 - 如何理解outstanding传输
查看>>
DDR3基本概念1 - 存储单元结构和原理
查看>>
verilog 基础原理1 - RTL中对数据位宽的管理
查看>>
Cadence IUS 之二: 生成波形
查看>>
DDR3基本概念2 - 上电复位时序
查看>>
DDR3基本概念3 - 复位初始化实战举例Lattice DDR3 IP仿真
查看>>
Lattice clarity designer在linux平台下无法找到已安装的IP的解决办法
查看>>
DDR3基本概念4 - 预充电和刷新,以及Lattice DDR3 SDRAM controller实战注意事项
查看>>
DDR3基本概念5 - DDR仿真中出现的Memory overflow错误的处理
查看>>
DDR3基本概念6 - Write leveling(写入均衡)
查看>>