其他分享
首页 > 其他分享> > 一路谈谈锁

一路谈谈锁

作者:互联网

Synchronized

一、使用

修饰类的:实例方法、静态方法、代码块;

实例方法:锁对象为当前实例对象:

public synchronized void sayHello(){
	System.out.println("Hello World");
}

静态方法:锁对象为当前类Class对象:

public static synchronized void sayHello(){
	System.out.println("Hello World");
}

代码块:

//锁对象
synchronized(this){}
//锁对象
synchronized(""){}
//锁class
synchronized(xxx.class){}

二、原理

2.1、Java对象头(Object Header)

普通对象:

|--------------------------------------------------------------|
|                     Object Header (64 bits)                  |
|------------------------------------|-------------------------|
|        Mark Word (32 bits)         |    Klass Word (32 bits) |
|------------------------------------|-------------------------|

数组对象:

|--------------------------------------------------------------|
|                     Object Header (64 bits)                  |
|------------------------------------|-------------------------|
|        Mark Word (32 bits)         |    Klass Word (32 bits) |
|------------------------------------|-------------------------|

其中Mark Word(32位,JVM为32位):

|-------------------------------------------------------|--------------------|
|                  Mark Word (32 bits)                  |       State        |
|-------------------------------------------------------|--------------------|
| identity_hashcode:25 | age:4 | biased_lock:1 | lock:2 |       Normal       |
|-------------------------------------------------------|--------------------|
|  thread:23 | epoch:2 | age:4 | biased_lock:1 | lock:2 |       Biased       |
|-------------------------------------------------------|--------------------|
|               ptr_to_lock_record:30          | lock:2 | Lightweight Locked |
|-------------------------------------------------------|--------------------|
|               ptr_to_heavyweight_monitor:30  | lock:2 | Heavyweight Locked |
|-------------------------------------------------------|--------------------|
|                                              | lock:2 |    Marked for GC   |
|-------------------------------------------------------|--------------------|

2.2、Monitor 监视器

在这里插入图片描述

todo:原理过程:

三、内存可见性

synchronized能解决内存可见性问题,被synchronized加锁后,他会做出以下操作:

  1. 获取同步锁;
  2. 清空内存;
  3. 从主内存中拷贝新的对象副本到工作线程中;
  4. 继续执行代码,刷新主内存的数据;
  5. 释放同步锁;

四、总结:

volatile关键字

内存可见性就是多个线程共享访问和操作相同的变量,但一个线程对一个共享变量的修改,另一个线程并不能马上被看到,甚至永远也看不到。

在计算机的系统中,除了内存。数据还会被缓存在CPU的寄存器以及各种缓存中,当访问一个变量时,可能直接从寄存器或CPU缓存中获取,而不一定到内存中去取,当修改一个变量时,也可能是先写到缓存中,稍后才会同步更新到内存中。在单线程的程序中,这一般不是问题。但是在多线程的程序中,尤其是在有很多CPU的情况下,这就是严重的问题。一个线程对内存的修改,另一个线程看不到,一是修改没有及时同步到内存,二是另一个线程根本就没从内存读。

标签:lock,一路,--------------------,谈谈,线程,内存,32,bits
来源: https://blog.csdn.net/code_agent/article/details/122074619