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,如果其中一个线程先获得锁,另一个线程不得执行.

方法二和方法三的叫类锁

公众号:

原文地址:https://www.cnblogs.com/qq289736032/p/10716259.html

时间: 2024-10-14 02:14:51

synchronized的使用方法和作用域的相关文章

synchronized的使用方法

synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块.  1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法.如:  public synchronized void accessVal(int newVal);  synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方

synchronized 修饰static方法

•1.依靠对象锁锁定 初始化一个对象时,自动有一个 对象锁. synchronized {普通方法}依靠对象锁工作,多线程访问synchronized方法,一旦某个进程抢得锁之后,其他的进程只有排队对待. synchronized void method{}功能上,等效于: void method{ synchronized(this) { ... } } •2.针对每个类,也有一个锁(作为类的Class对象的一部分), 所以synchronized static方法可以在类范围内防止对stat

synchronized修饰普通方法和静态方法

首先,要知道,synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this.而修饰静态方法时,锁是类锁,也就是类名.class. synchronized修饰普通方法 Synchronized修饰普通方法时,锁是对象锁(this). 当该类中有多个普通方法被Synchronized修饰(同步),那么这些方法的锁都是这个类的一个对象this.多个线程访问这些方法时,如果这些线程调用方法时使用的是同一个该类的对象,虽然他们访问不同方法,但是他们使用同一个对象来调用,那么这些方法的锁

synchronized(修饰方法和代码块)

synchronized(修饰方法和代码块) 1. 含义 synchronized 是同步锁,用来实现互斥同步. 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作). synchronized 还可以保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代 volatile 功能,但是 volatile 更轻量,还是要分场景使用). 2. 用法 synchr

第三章、方法和作用域

1.方法是具名的语句序列 2.方法名和变量名遵循相同的标识符命名规则. 3.return通常放到方法尾部,因为它导致方法结束,控制权返回调用方法的语句,return后面的任何语句都不执行(如果return语句之后还有其他语句,编译器会发出警告). 4.假如不希望方法返回数据(返回类型是void),可利用return语句的一个变体立即从方法中退出.为此,请先写关键字return,紧跟一个分号.如下所示: void showResult(int answer) { ....... return; }

PHP方法的作用域

PHP支持6种方法作用域:public.private.protected.abstract.final和static,本文只讨论前5种作用域. public:公共作用域.(就像空气和阳光,天下公用) 公共作用域的权限最为开放,类的内部外部都能访问,类的父类和子类也都能访问,类的对象也能访问,没什么特殊的权限限制,可以自由的在任何地方使用. private:私有作用域.(就像皇帝的妃子,只供皇帝[类]自己享用,连皇帝的兄弟[类的实例对象]和儿子孙子[子类]都不能用) 私有作用域声明的方法只能在类

类锁和对象锁,synchronized修饰static方法与非static方法的区别

当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例), 作用范围是整个静态方法,作用的对象是这个类的所有对象. 当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象), 作用范围是整个方法,作用对象          是调用该方法的对象 结论: 类锁和对象锁不同,它们之间不会产生互斥 原文地址:https://www.cnblogs.com/alter888/p/9840402.html

synchronized锁普通方法和锁静态方法

1.对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性 2.在静态方法上的锁,和 实例方法上的锁,默认不是同样的,如果同步需要制定两把锁一样. 3.关于同一个类的方法上的锁,来自于调用该方法的对象,如果调用该方法的对象是相同的,那么锁必然相同,否则就不相同.比如 new A().x() 和 new A().x(),对象不同,锁不同,如果A的单利的,就能互斥. 4.静态方法加锁,能和所有其他静态方法加锁的 进行互斥 5.静态方法加锁,和xx.class 锁效果一样,直接属于类的 转载:http

C#基本语法复习-方法与作用域

重载方法: 只能够对参数列表进行重载,不能够对返回类型进行重载. 定义可选参数: 指定一个参数是可选的,可以在定义方法时为该参数提供一个默认值,默认值是使用赋值操作符来进行赋值的.并且所有的可选参数必须放在必选参数之后.形式如下: void a(int a,int b=0;string c="a") { } 对方法进行调用时,方法调用最匹配的那个,a(2)是正确的,但是a(2,"e");则为错误,编译器会选择前两个int来匹配. 命名参数: 格式为一个参数名,后面加