《Java多线程编程核心技术》学习笔记

第2章 对象及变量的并发访问

2.1 synchronized同步方法

方法内的变量为线程安全:

  方法内部的变量是线程私有的

  方法中有一个变量num,后面对它赋值

  两个线程同时调用这个方法,对其赋不同的值,不会出现非线程安全的问题

实例变量非线程安全:

  多个线程共同访问一个对象中的实例变量,则会出现非线程安全的问题

  对方法加上synchrongized,则可以解决该问题

多个对象多个锁:

  两个线程访问不同对象的方法,则是线程安全的

  即使获得了锁,也不会同步,因为不是用一个对象的锁

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

  A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需等待,也就是同步。

synchronized锁重入

  关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的。

  这也证明在一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的。

  可重入锁也支持在父子类继承的环境中。

出现异常,锁自动释放

同步不具有继承性

2.2 synchronized同步语句块

  synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待较长的时间,在这种情况下可以使用同步语句块来解决。

  当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非synchronized(this)同步代码块。

  当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中所有其他synchronized(this)同步代码块的访问将被堵塞,这说明synchronized使用的“对象监视器”是一个。

  如果使用同步代码块锁定非this对象,则不会与其他硕this同步方法争抢this锁。

  synchronized加到静态方法上,是给Class类加锁,加到非静态方法上,是给对象加锁

  程序设计时要避免双方互相持有对方的锁的情况,避免死锁。

猜你喜欢

转载自www.cnblogs.com/mengchunchen/p/9096547.html