Synchronized的使用和注意事项

 

synchronized:java

一、取得的锁都是对象锁,而不是把一段代码或方法(函数)看成锁;安全

二、多个线程访问的必须是同一个对象。多线程

三、当一个线程执行的代码出现异常时,其所持有的锁会自动释放并发

四、A线程持有Object对象的Lock锁,B线程能够以异步方式调用Object对象中的非synchronized类型的方法异步

五、A线程持有Object对象的Lock锁,B线程若是在这时调用Object对象中的synchronized类型的方法则须要等待,也就是同步函数

六、当一个线程获得一个对象锁后,再次请求此对象锁时时能够再次获得该对象的锁的;this

 

代码块:spa

一、A线程访问对象的synchronize代码块时,B线程依然能够访问对象的非synchronize代码块;线程

二、A线程访问对象的synchronize代码块时,B线程依然能够访问对象的synchronize代码块将会被阻塞;对象

三、线程A访问对象调用synchronize代码块时,线程B访问对象的synchronize方法时,将获取线程A的对象锁;

四、"任意对象"做为对象监视器来实现同步的功能。这个"任意对象"大多数是实例变量及方法的参数,全局实例变量,synchronized(非this),

        不用阻塞每个代码块,有效提升效率。

 

静态同步方法是类锁,非静态同步方法时对象锁,独立执行。

一、局部变量每调用一次方法其值都在当前线程的当前栈中临时分配;

二、也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了;

三、因此多线程并发访问一个只用到局部变量的方法是不用考虑并发安全性的。

 

 

  • synchronized (object)与synchronized (this)同样,获取实例对象的锁.
  • 由于synchronized (this)只能获取当前实例锁,那么synchronized (object)就是能够获取其余实例锁的意思
  • 对于synchronized 最简单粗暴的理解就是,你要哪些线程方法同步,就跟他们获取同样的锁好了,A.class,就获取A.class, 
  •  objectA 就获取 objectA(我说的不是对象名相同,而是真真切切在java堆中的同一个对象),

 



synchronized与static synchronized 的区别

synchronized是对类的当前实例(当前对象)进行加锁,防止其余线程同时访问该类该实例的全部synchronized块

static synchronized刚好就是要控制类的全部实例的并发访问

相关文章
相关标签/搜索