Java中的同步和同步块

oop

我有一些关于Java同步的问题。

public class A {

    private int i;

    public A (int t) { i = t; }

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

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

假设我有一个如上所述实现的类,并且创建了一个类型为A的对象(p)。

我知道只能有一个线程执行p.increment(),但是另一个线程可以同时执行p.decrement()吗?

谢谢〜

所罗门慢

synchronized不保护方法。synchronized不保护对象。synchronized只做一件事,而只有一件事。

您编写增量方法的方式实际上只是编写此内容的一种简便方法:

public void increment() {
    synchronized(this) {
        i++;
    }
}

表达它的这种更长的路明确表示synchronized正在操作this

因此,要做的一件事synchronized是:JVM不允许两个线程同时在同一个对象上同步。

如果您拥有类型A的对象p,则答案为“否”。JVM不允许一个线程在另一个线程执行递减操作的同时执行增量操作,因为两个线程都将尝试在同一对象p上进行同步。

另一方面,如果您有一个对象p和另一个对象q(均为A),则一个线程可能在p.increment()调用中,而另一个线程在q.decrement()调用中。这是因为每个线程将不同的对象上进行同步,这允许的。


PS:synchronized实际上做了与Java概念有关的另一件事,即“之前发生”。在深入了解多线程编程之前,您应该了解一下(Google是您的朋友)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中的同步方法和同步块

来自分类Dev

了解Java中的同步块

来自分类Dev

简化Java中的同步块

来自分类Dev

Java中的同步块与同步方法限定符

来自分类Dev

无法理解Java中的同步块

来自分类Dev

Java线程:同步块

来自分类Dev

Java同步块

来自分类Dev

java线程同步块

来自分类Dev

同步块中的notify()

来自分类Dev

同步方法和同步块之间的区别

来自分类Dev

Nashorn:同步方法和块

来自分类Dev

Java 多线程 - 同步块中的读取器和写入器线程

来自分类Dev

Java多线程同步块

来自分类常见问题

Java同步块进入和退出时的内存障碍

来自分类Dev

Android Java处理程序,线程同步块(notifyall和Wait)

来自分类Dev

PHP 7中的同步块

来自分类Dev

main方法中的同步块

来自分类Dev

多线程中的同步块

来自分类Dev

同步块中的静态和非静态锁定对象

来自分类Dev

Java中同步块/方法中处理异常的最佳实践

来自分类Dev

同步块内部的同步块

来自分类Dev

Java中的哈希表和同步

来自分类Dev

Java中的线程安全和代码同步

来自分类Dev

我可以访问Java中同步块使用的锁吗?

来自分类Dev

Java在同步块中调用其他方法

来自分类Dev

在java中的同步块内调用@async方法

来自分类Dev

同步方法或同步块:在java中编写单例类时哪个更好?

来自分类Dev

Java和同步链表

来自分类Dev

在同步方法内部的线程中的同步块会发生什么?