@@ -54,7 +54,7 @@ synchronized关键字解决的是多个线程之间访问资源的同步性,sy
54
54
** synchronized关键字最主要的三种使用方式:**
55
55
56
56
- ** 修饰实例方法:** 作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁
57
- - ** 修饰静态方法:** : 也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份)。所以如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,** 因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁** 。
57
+ - ** 修饰静态方法:** 也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份)。所以如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,** 因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁** 。
58
58
- ** 修饰代码块:** 指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
59
59
60
60
** 总结:** synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class 类上锁。synchronized 关键字加到实例方法上是给对象实例上锁。尽量不要使用 synchronized(String a) 因为JVM中,字符串常量池具有缓存功能!
@@ -176,7 +176,7 @@ synchronized 是依赖于 JVM 实现的,前面我们也讲到了 虚拟机团
176
176
### 2.1. 讲一下Java内存模型
177
177
178
178
179
- 在 JDK1.2 之前,Java的内存模型实现总是从** 主存** (即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存** 本地内存** 比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成** 数据的不一致** 。
179
+ 在 JDK1.2 之前,Java的内存模型实现总是从** 主存** (即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存** 本地内存** ( 比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成** 数据的不一致** 。
180
180
181
181
![ 数据不一致] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/数据不一致.png )
182
182
@@ -331,7 +331,7 @@ ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
331
331
332
332
### 3.4. ThreadLocal 内存泄露问题
333
333
334
- ` ThreadLocalMap ` 中使用的 key 为 ` ThreadLocal ` 的弱引用,而 value 是强引用。所以,如果 ` ThreadLocal ` 没有被外部强引用的情况下,在垃圾回收的时候会 key 会被清理掉,而 value 不会被清理掉。这样一来,` ThreadLocalMap ` 中就会出现key为null的Entry。假如我们不做任何措施的话,value 永远无法被GC 回收,这个时候就可能会产生内存泄露。ThreadLocalMap实现中已经考虑了这种情况,在调用 ` set() ` 、` get() ` 、` remove() ` 方法的时候,会清理掉 key 为 null 的记录。使用完 ` ThreadLocal ` 方法后 最好手动调用` remove() ` 方法
334
+ ` ThreadLocalMap ` 中使用的 key 为 ` ThreadLocal ` 的弱引用,而 value 是强引用。所以,如果 ` ThreadLocal ` 没有被外部强引用的情况下,在垃圾回收的时候, key 会被清理掉,而 value 不会被清理掉。这样一来,` ThreadLocalMap ` 中就会出现key为null的Entry。假如我们不做任何措施的话,value 永远无法被GC 回收,这个时候就可能会产生内存泄露。ThreadLocalMap实现中已经考虑了这种情况,在调用 ` set() ` 、` get() ` 、` remove() ` 方法的时候,会清理掉 key 为 null 的记录。使用完 ` ThreadLocal ` 方法后 最好手动调用` remove() ` 方法
335
335
336
336
``` java
337
337
static class Entry extends WeakReference<ThreadLocal<?> > {
@@ -622,4 +622,4 @@ tryReleaseShared(int)//共享方式。尝试释放资源,成功则返回true
622
622
623
623
** Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 ** “1”** 即可免费无套路获取。
624
624
625
- ![ 我的公众号] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png )
625
+ ![ 我的公众号] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png )
0 commit comments