java 多线程核心技术第二章笔记

来源:互联网 发布:redis 查看所有数据库 编辑:程序博客网 时间:2024/06/01 20:41
1.synchronized 同步方法
注意点:方法内部的变量是不会存在线程安全的问题的
实例变量 也就是成员变量吧 才会出现线程安全的问题

两个线程访问同一个对象中的实例变量可能会出现非线程安全的问题。要防止这个问题的发生可以在方法上加同步synchronized关键字 对这个方法加锁。这样的话一个线程持有这把同步锁那么其他线程在执行这个方法的时候就会等待。
注意:java中的锁是对象级的 一个对象中的方法上有一把锁,那么多个相同的对象,就会有多把锁,不同对象之间是不会相互影响的。

synchronized 锁重入 就是在一个线程得到了当期对象的锁,再次请求此对象锁时候可以再次得到改对象的锁。一个synchronized方法或块的内部调用本来的其他synchronized方法或块时,永远可以得到锁。获取自己对象内部锁
还是说明这个锁是对象级别的锁。
可重入的锁也支持在父子类继承的环境中。子类可以通过可重入的锁调用父类的同步方法
当一个线程执行的代码出现异常时,其所持有的锁会自动释放。

同步不具有继承性
在父类的方法中有一个同步方法 但是在子类继承父类的时候重写的这个方法并不是synchronized,那么在调用子类的这个方法的时候并不是同步的。


2.同步语句块
用synchronized关键字声明方法是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程必须等待较长的时间,在这样的情况下使用同步代码块 synchronized(this)

同步语句块也是对象锁,也就是说在一个对象的所有同步代码块或者所有同步方法,在一个线程执行其中一个的时候其他方法是阻塞的。其他线程是不能调用的。

synchrnized(非this对象) 可以实现一种异步的运行方式
非this对象其实是本身做为了一个对象监视器

细化三个结论:
A:当多个线程执行synchronized(非this对象){} 同步代码块时呈现同步效果
B:当其他线程执行非this对象(X)中的synchronized方法时候呈现同步效果
C: 当其他线程执行X对象方法里的synchronized(this)也呈现同步效果

静态同步方法,synchronized public static methodA()
静态同步方法是在class上加锁而不是对象锁,所以范围更大,一样的对象就是持有一样的一把锁
同步类 synchronized(A.class)
都是类级别的锁。

同步string的问题
public void method(String string){
synchronized(string){} 直接同步一个string
}

如果在run方法中调用这个method方法
传参("AA") 不同线程都是这样的传参 那么这是持有一把锁
传参(new String("AA") 那么这个不是持有一把锁
对象级别的锁 new 出来的是不同的对象 但是直接初始化一个字符串字符串存在于常量池

可以用String 来改变锁对象

java 中多线程的死锁

3.volatile 关键字 使变量在多个线程中可见。 只有可见性,没有同步性 原子性

i++ 的同步实现 new AtomicInterger() 这个类中的increamentAndGet() 方法实现i++的原子性
原创粉丝点击