synchronized的使用方法和作用域
Posted qq289736032
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized的使用方法和作用域相关的知识,希望对你有一定的参考价值。
文章地址:https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554746&idx=1&sn=8e45e741ca9f058dba1f3ebbea0e9f07&chksm=f3f833ecc48fbafa295e355c1cdd52dc4259f161dafdc1703d181a5e9f4f76563c98493bd221&token=2005887224&lang=zh_CN#rd
synchronized是保证多线程同步执行的关键字,它的用法有以下几种
对象锁
public class MyClass{
public synchronized void method1(){
//dosomething
}
public synchronized void method2(){
//dosomething
}
public void method3(){
//dosomething before synchronized
synchronized(this){
//dosomething
}
}
public void method4(){
//dosomething
}
}
如果用三个线程分别执行方法一,方法二,方法三, 当一个线程抢先获取得锁之后,其他线程在此刻不能继续执行,这种锁叫做对象锁.锁住的是整个对象.上面代码synchronized放在方法前以及代码块加(this),这两种方式.如果还有其他线程则会执行普通方法以及同步代码块前的普通代码
类锁
public class MyClass{
public synchronized void method1(){
//dosomething
}
public static synchronized void method2(){
//dosomething
}
public void method3(){
synchronized(MyClass.class){
//dosomething
}
}
}
以上代码,
情况1:如果用两个线程去执行方法1和方法2,两个线程会获取各自的锁各自执行自己的代码,
情况2:两个线程都执行方法2,如果一个线程抢先获得锁,另一个线程不得执行
情况3:两个线程分别执行方法1和方法3,两个线程会获取各自的锁各自执行自己的代码,
情况4,两个线程都执行方法3,如果其中一个线程先获得锁另一个线程不得执行
情况5,两个线程分别执行方法2和方法3,如果其中一个线程先获得锁,另一个线程不得执行.
方法二和方法三的叫类锁
公众号:
以上是关于synchronized的使用方法和作用域的主要内容,如果未能解决你的问题,请参考以下文章
对于 GNU ld 'legacy __sync_synchronize' 警告,我能做些啥?
在哪些情况下 __sync_synchronize 会接收任何参数?
还是说Memory Model,gcc的__sync_synchronize真是太坑爹了
这里是不是需要内存屏障“*pEnd_ = v; __sync_synchronize (); ++pEnd_;”?