同步

1)同步方法

2)同步块

  21) 实例变量

22) 类变量

锁定的内容

1)锁定类的某个特定实例

2)锁定类对象(类的所有实例)

一。同步类实例:同步方法

public class Demo {     

    public synchronized void m1(){
//...............
} public void m2(){
//............ synchronized(this){
//.........
} //........
}
}

这两种写法的效果是一样的,锁定的都是类实例对象。

  如果有一个实例对象demo,有两个线程: thread1,thread2,都调用了demo 对象,如果 thread1调用了demo.m1(),

则thread2在该时间内不能访问demo.m1() 和 demo.m2(); 因为thread1把demo这个对象的锁使用了,所以无法分给其它线程使用。但是,如果thread1

调用 demo1.m1(), thread2调用 demo2.m1(), 则可以同时进行,因为它们调用的是不同的Demo类对象实例。

二。同步类实例:同步块(比同步方法更灵活)

public class Demo {
Object a = new Object();
Object b = new Object(); public void m1(){
//............ synchronized(a){
//.........
} //........
} public void m2(){
//............ synchronized(b){
//.........
} //........
}
}

  这种情况下,是实现代码块锁定,锁定的对象是 变量 a 或 b; 如果有一个实例对象 demo,另外有两个线程: thread1,thread2,

都调用了demo 对象,那么,在同一时间,如果 thread1调用了demo.m1(),则thread2在该时间内可以访问demo.m2();但不能访问

demo.m1() 的同步块, 因为a被 thread1锁定了。

三。锁定静态变量或静态方法

public class Demo{
static Object o = new Object(); public static synchronized void m1() {
//....
} public static void m2() {
//...
synchronized (Demo.class) {
//.....
}
//.....
} public static void m3() {
//..........
try {
synchronized (Class.forName("Demo")) {
//............
}
} catch (ClassNotFoundException ex) {
}
//.............
} public static void m4() {
//............
synchronized(o){
//........
}
//..........
}
}

以上4个方法中实现的效果都是一样的,其锁定的对象都是类Demo,而不是实例对象 ,即在多线程中,其共享的资源是属于类的,而不是属于类实例的。

在这种情况下,如果thread1 访问了这4个方法中的任何一个, 在同一时间内其它的线程都不能访问 这4个方法。

Java Synchronized 遇上 静态/实例方法 、静态/实例变量的更多相关文章

  1. 当Java代码遇上抽象、重载加重写,一切都不美好了

    当Java代码遇上抽象.重载加重写.一切都不美好了 前几天调程序遇上个奇怪的bug.一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存 ...

  2. Java中实例方法,实例变量,静态方法,静态变量,final方法重写的问题,覆盖

    Java中只有非私有的实例方法能被重写,即实现多态,子类可以覆盖父类的方法,但是实例变量不能覆盖,若子类和父类均定义了同样名称的变量,则对于子类来说这是两个不同的变量,要想调用父类的变量必须显示去调用 ...

  3. java静态类、静态方法、静态代码块,静态变量及实例方法,实例变量初始化顺序及内存管理,机制

    1.当一个类被第一次使用时,它需要被类加载器加载,而加载过程涉及以下两点: (1)在加载一个类时,如果它的父类还未被加载,那么其父类必须先被加载: (2)当类加载到内存之后,按照在代码中的出现顺序执行 ...

  4. 区别JS中类的静态方法,静态变量,实例方法,实例变量

    1.类的静态方法 先来段代码之后分析 // JS类静态函数 function BaseClass() { } // 类添加add函数 BaseClass.add = function() { cons ...

  5. JAVA类与对象(六)------实例变量与类变量的区别,实例方法和类方法的区别

    实例变量 实例变量声明在一个类中,但在方法.构造方法和语句块之外: 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被 ...

  6. 编写Java程序,实现多线程操作同一个实例变量的操作会引发多线程并发的安全问题。

    查看本章节 查看作业目录 需求说明: 多线程操作同一个实例变量的操作会引发多线程并发的安全问题.现有 3 个线程代表 3 只猴子,对类中的一个整型变量 count(代表花的总数,共 20 朵花)进行操 ...

  7. Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  8. 在自学java路上遇上的南墙

    从2016年12月20号自学java,先是咨询了下培训中心,得小两万,四个月毕业,算了一笔账,一百二十天,合下来每天三百多块,再加上开销之类压力太大,于是开始入坑自学,随后血一般的教训直面而来: 1. ...

  9. FasfDFS整合Java实现文件上传下载功能实例详解

    https://www.jb51.net/article/120675.htm 在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java ...

随机推荐

  1. 设置MATLAB中Current Folder的默认文件夹(转载)

    设置MATLAB中Current Folder的默认文件夹 在我们使用MATLAB的过程中,其Current Folder面板会给我们带来一定的便利性.但遗憾的是,MATLAB自身没有提供友好的设置界 ...

  2. css 制作三角形图标 不支持IE6

    .triangle { width: 10px; height: 10px; overflow: hidden; border-left: 4px solid rgba(, , , ); border ...

  3. 爬虫 (4)- Selenium与PhantomJS(chromedriver)与爬取案例

    Selenium文档 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器 ...

  4. Expectation Maximization(EM)算法note

    EM算法,之前上模式识别课上,推导过,在<统计学习方法>中没耐性的看过几次,个人感觉讲的过于理论,当时没怎么看懂,后来学lda,想要自己实现一下em算法,又忘记了,看来还是学的不够仔细,认 ...

  5. SecureCRT超级终端使用说明

    SecureCRT超级终端使用说明 一.连接POS机 1.运行SecureCRT,选择‘文件’菜单,在下拉菜单中选择‘快速连接’菜单: 2.在弹出的对话框中按如下图选择参数: 3.POS端开机,且数据 ...

  6. js阻止事件冒泡和标签默认行为

    ////阻止事件冒泡函数和 // 阻止默认浏览器动作(W3C) 要一起使用效果好<a href="/Scripts/newfiber_js_lib/images/1.jpg" ...

  7. java之路径问题

    1.this.class.getClassLoader().getResource("路径").getPath();路径参数不能以“/”开头,获取classes目录下文件的路径 2 ...

  8. 【Python】求素数-稍加优化

    print 'Find prime number smaller then input number \n' print 'Please input a number:' import datetim ...

  9. webpack文档翻译

    https://segmentfault.com/a/1190000007568507

  10. Extjs4 中date时间格式的问题

    在Grid中显示时间,后台传过来的是date格式的数据(PHP date('Y-m-d', time()),一般在Ext model中定义数据的类型和格式: {name:'birth', type:' ...