`

synchronized的作用(二)

    博客分类:
  • j2se
阅读更多
引申:
对于这种多个实例,要想实现同步即输出的数字是有序并且按线程先后顺序输出,我们可以增加一个静态变量,对它进行加锁(后面将说明锁定的对象)。

修改目标类:

public class TestThread {
    private static Object lock=new Object(); //必须是静态的。
    public  void execute(){
        synchronized(lock){
            for(int i=0;i<100;i++){
                   System.out.println(i);
               }    
           }
       }
}

二、同步代码块

public void method(SomeObject so){
    synchronized(so)
       //…..
       }
}

锁定一个对象,其实锁定的是该对象的引用(object reference)
谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以按上面的代码写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它必须是一个对象)来充当锁(上面的解决方法就是增加了一个状态锁)。

a、锁定一个对象,它不是静态的
private byte[] lock = new byte[0]; // 特殊的instance变量

目标类:

public class TestThread {
    private Object lock=new Object(); 
    public  void execute(){
        synchronized(lock){  //增加了个锁,锁定了对象lock,在同一个类实例中,是线程安全的,但不同的实例还是不安全的。

因为不同的实例有不同对象锁lock
            for(int i=0;i<100;i++){
                   System.out.println(i);
               }    
           }
       }
}
 

其实上面锁定一个方法,等同于下面的:

public void execute(){  
    synchronized(this){   //同步的是当然对象
        for(int i=0;i<100;i++){
               System.out.println(i);
           }    
       }
}
分享到:
评论

相关推荐

    深入理解Java并发之synchronized实现原理.docx

    关键字 synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证...

    Java多线程和并发知识整理

    二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、Synchronized 详解 3.1 使用 3.2 原理分析 3.3 JVM中锁的优化 3.4 Synchronized与Lock 3.5 扩展 四、volatile 详解 ...

    变态级JAVA程序员面试32问

     第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?  第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被...

    JAVA面试题 对JAVA面试有帮助!

     第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?  第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被...

    利用内置的动画元素产生可伸缩向量图形

    可伸缩向量图形(Scalable Vector Graphics,SVG)是一种用于绘制二维图形的基于 XML 的语言。听上去没有吸引力?它的作用还远不止这一点。SVG 具有许多令人激动的可用特性,例如转换、alpha 蒙片、滤镜效果和动画。...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致问题的引入.mp4 │ 高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速...

    史上最全java面试,103项重点知识,带目录

    二、容器 8 18. java 容器都有哪些? 8 19. Collection 和 Collections 有什么区别? 9 20. List、Set、Map 之间的区别是什么? 9 21. HashMap 和 Hashtable 有什么区别? 10 22. 如何决定使用 HashMap 还是 TreeMap...

    java面试题进阶版附答案.docx

    三、线程同步和互斥锁:解释了线程同步的概念,以及互斥锁的作用,包括使用synchronized关键字和Lock接口实现线程同步的方式。 四、反射机制:解释了Java中的反射机制,包括在运行时动态获取类的信息,操作类的属性...

    JAVA面试题最全集

    二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中需要处理HTML标记时,应做什么样的处理,要筛选那些字符(&lt; &gt; & “”) 3.在JSP中如何读取客户端的请求,如何访问CGI变量...

    二十三种设计模式【PDF版】

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

    java-advance:java进阶,包含 常用设计模式、线程和并发、spring核心代码、mybatis核心代码、springboot2.0、springcloud G版本、docker的使用、各类面试题

    java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized、volatile、cas手写ASQSpring5IOC容器设计原理及高级特性AOP设计原理FactoryBean与BeanFactorySpring事务处理机制Spring JDK动态代理...

    Java进阶教程解密JVM视频教程

    JVM 内存结构的组成、各部分功能作用,学会利用内存诊断工具排查内存相关问题;2. JVM 的招牌功能-垃圾回收机制是如何工作的,如何进行垃圾回收调优;3. Java 程序从编译为字节码到加载到运行的全流程,各个阶段的...

    Java常见面试题208道.docx

    4.final 在 java 中有什么作用? 5.java 中的 Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与 String str=new String(“i...

    java面试宝典2012版.pdf

    二. Jav线程部分 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 47、sleep() 和 wait() 有什么区别? 48、同步和异步有何异同,在什么情况下分别使用...

    JAVA多线程技术分享-39页PPT(winding)

    1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3,线程停止打断 4,守护线程 二 锁: 1,乐观锁 悲观锁 2,自旋锁 适应性自旋锁 3,synchronized 锁升级 4,公平锁 非公平锁 5,可重入锁 非可重入锁 三: ...

    java编程规范(第三版)

    6.3 声明的作用域 88 6.4 成员和继承 92 6.5 确定名称的含义 95 6.6 访问控制 104 6.7 完全限定的名称和规范名称 109 6.8 命名约定 110 第7章 包 116 7.1 包成员 116 7.2 包的主机支持 117 7.3 编译单元 ...

    千方百计笔试题大全

    20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 10 22、我们在web 应用开发过程中经常...

    java面试宝典

    20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 10 22、我们在web 应用开发过程中经常...

    超级有影响力霸气的Java面试题大全文档

    抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承...

Global site tag (gtag.js) - Google Analytics