《java多线程编程核心技术》核心笔记(一)

时间:2022-12-28 13:57:13

《java多线程编程核心技术》核心笔记(一)

线程具有优先级 

线程的优先级具有继承特性。被调用者继承调用者的优先级
 
优先级高的线程 绝大部分会现执行




方法内的变量是线程安全的。


多个线程访问同一个对象的同步方法时,一定是线程安全的。


synchronized取得的是对象锁 多个线程访问一个对象 Synchronized


如果一个资源不是共享的 


A线程先持有object对象的Lock锁 B线程可以异步调用object对象中的非synchronized类型的方法


A线程先持有object对象的Lock锁 B线程如果也调用对象中的synchronized类型的方法 那么需要排队等待.


虽然在复制的时候进行了同步,但是在取之的时候如果不同步会出现意向不到的情况,会已经被其他线程更改过了.


可重入锁的概念是:自己可以再次获取自己的内部锁。比如有1条线程获得了一个对象锁,此时这个对象锁还没有释放,
当其想再次获得对象锁的时候还是可以获取的,要不然就会造成死锁的状态.


若线程执行过程中出现异常,则所持有的对象锁会自动释放.


如果父类是同步方法 而子类不是同步方法 那么子类是不能继承父类的同步方法的。


当然用Synchonized同步方法是有弊端的 有的时候需要用同步代码块来实现.


不在Synchonized块就是异步  在Synchonized就是同步


锁非this对象具有一定的优点:如果在一个类中有很多个Synchronized,这是虽然能同步,但是会受到阻塞,效率上面会大大降低
因此非this锁的意义就在在一个对象中,Synchonized可以锁定不同的对象 ,他们彼此之间是异步的。


由于线程执行的顺序具有不确定性,那么当AB两个线程执行带有分支判断的额方法时,就会出现逻辑错误.


当多线程同时执行Synchronized(x){}同步代码块时呈同步效果
当其他线程执行x对象中的Synchronized同步方法时呈同步效果
当其他线程执行x对象的Synchronized(this)代码块时也是同步效果


synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”,
类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,
static synchronized是限制线程同时访问jvm中该类的所有实例同时访问对应的代码块.
synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同。
同步Synchronized(class)代码的作用和synchronized static方法的作用是一样的.


在一般情况下Synchronized不使用String作为锁对象,这是由于String的常量池所决定的,容易造成死锁的特点。而改用其他 比如new Object();


在双方互相等待对方释放锁就有可能出现死锁的现象.


只要锁对象不变,即使对象的属性改变了 运行的结果还是同步的。


哪句话有什么不明白的加我微信wangyan199366