美文网首页
同步方法

同步方法

作者: 原创迷恋者 | 来源:发表于2019-10-14 16:50 被阅读0次

JAVA编程语言提供了两种基本的同步做法:同步方法和同步语句。其中更为复杂的同步语句会在之后的章节讲。这个章节是关于同步方法的。

想要让一个方法成为同步方法,只需要在方法定义中加入synchronized关键字即可。

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}

假设counter是SynchronizedCounter的一个实例,那么将其中的方法变为同步方法有两个影响:

  • 首先,相同对象的两个同步方法的调用不可能交错。当一个线程在运行一个对象的某个同步方法时,其他也调用了此方法的线程必须阻塞,直到第一个线程完成工作。
  • 其次,当退出一个同步方法时,它会和之后对该对象的该方法的调用自动建立一个happens-before关系。这保证了一个线程对对象状态的修改向其他线程可见。

注意,构造方法是不能同步的——使用synchronized方法修饰构造器,是一个语义错误。同步的构造方法是没有意义的,因为只有想要构造对象的线程,在构造对象时,才会去访问它。

警告:在构造一个需要共享的对象时,小心对该对象的引用没有过早地泄露出去。举个例子,你想要维护一个instances列表,其中包含所有class的实例。你可能很想往你的构造器中加入这行代码:

instance.add(this);

但这样一来,其他线程就可以使用instance,在对象创建完毕之前,来访问它。

同步方法保证了一种简单的防止线程混淆和内存不一致问题的策略:如果一个对象对超过1个线程可见,所有对该对象的读写操作都需要通过同步方法完成(除了非常特殊的final域,它被创建之后,就无法被修改;它在非同步方法中,也可以安全地读,只要这个对象已经被构造出来)。这个策略是有效的,但它也可能会导致活锁地问题,我们会在接下来的课程中看到。

相关文章

  • java同步线程(二)

    java同步线程(二) 同步方法: 使用synchronized关键字来修饰某个方法,则该方法称为同步方法。同步方...

  • 高并发编程基础

    1.同步方法锁定的是锁对应的其它同步方法,不影响调用非同步方法或其它锁对应的同步方法。 2.同步方法只能保证当前方...

  • 多线程之线程同步

    同步的方法: 1.Java 同步关键字(synchronized) 实例方法实例方法同步是同步在拥有该方法的对象上...

  • 释放锁的三种情况

    1.执行完同步方法或同步代码块 2.在同步方法或同步代码块中调用wait方法 3.在同步方法或同步代码块中发生异常...

  • 【synchronized】同步方法与同步块

    这里我们分三块来解读学习: 同步方法思想同步块思想同步方法与同步块的区别 1. 同步方法思想 上面是我画的同步方法...

  • Synchronized锁 偏向锁 锁优化

    Synchronized实现同步 同步普通方法,锁当前实例对象 同步静态方法,锁当前类的Class对象 同步方法块...

  • 2020-07-27 同步方法解决线程安全问题

    2.同步方法 1.使用同步方法解决实现Runnable接口方法解决线程同步安全问题 2.使用同步方法解决继承Thr...

  • 理解synchronized

    实例同步方法 静态同步方法 实例同步方法块 静态同步方法快 每一个类都对应一个Class对象,这个Class对象只...

  • 从一道面试题引申出的java锁机制原理

    面试题: 两个同步方法a、b,问在方法a中是否可以顺利访问方法b 答案:可以。 同步方法 同步方法是在方法签名上有...

  • synchronized关键字与Monitor对象研究

    1、关于同步方法的总结 同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。 非静态的同步方法,同步监视器是:...

网友评论

      本文标题:同步方法

      本文链接:https://www.haomeiwen.com/subject/zgwrmctx.html