当前位置: 首页 > 知识库问答 >
问题:

同步块/代码Java上的线程访问

辛建业
2023-03-14

我在读同步工作。下面是一个例子:

public class Singleton{

private static volatile Singleton _instance;

public static Singleton getInstance(){
   if(_instance == null){
            synchronized(Singleton.class){
              if(_instance == null)
              _instance = new Singleton();
            }
   }
   return _instance;
}

假设两个线程 AB 正在访问 getInstance(); 方法,如果线程 A 位于同步块中,则线程 B 将跳过该块并执行下一个块/语句,或者将等待/阻止,直到线程 A 离开同步块。

第二,什么是< code>synchronized参数中的< code>Singleton.class以及它何时可以为< code>null

下面的<code>语句

内部锁位于对象上:

class A
{
   public synchronized void method1(){...}
   public synchronized void method2(){...}
}

如果线程A位于方法1中,则threadB无法输入方法2或任何其他同步方法。

共有2个答案

斜瑞
2023-03-14

有关synchronized关键字的文档,请参见此处。

在方法上使用<code>synchronized<code>一次只允许一个线程访问该方法。所有其他线程将阻塞并排队等待执行。使用此关键字时,实例对象将用作同步执行的锁。如果在同一对象上调用方法,一次只有一个线程可以持有锁,因此您的语句为true。

在方法上使用<code>synchronized

吴均
2023-03-14

1:线程B将等待,直到线程A释放同步对象上的锁并执行代码,之后它将获取同步对象上的锁。

2:单例.class是表示该类的对象。您正在对其进行同步,因为您的_instance对象为 null。

public synchronized void method1(){...}

在对象上同步,在你调用那个方法的时候,这意味着两个线程会互相等待,如果你像这样调用它:

final A a = new A();
new Thread(new Runnable(){
    public void run(){
        a.method1();
    }
}).start();
a.method1();

但如果在不同的对象上调用,两个线程将并行执行:

A a = new A();
final A b = new A();
new Thread(new Runnable(){
    public void run(){
        b.method1();
    }
}).start();
a.method1();

最后一个问题:对,线程B不会进入方法2,因为同步方法锁定了对象

顺便说一句。

public synchronized void method1(){...}

相当于:

public void method1(){
    synchronized(this){
        ...
    }
}
 类似资料:
  • 问题内容: 我正在阅读同步工作。这是示例: 让假定有两个线程和正在访问的方法,如果线程是块则线程将跳过该块,执行下一个块/语句或将等待/阻塞,直到线程离开 块。 第二是什么,为什么在参数中以及什么时候可以 下面是真的吗? 内在锁在对象上: 如果线程A在其中,则无法输入或任何其他同步方法。 问题答案: 1:线程B将等待,直到线程A释放对同步对象的锁定之后,线程A将释放对同步对象的锁定并执行代码。 2

  • 主要内容:1 什么是Java同步代码块,2 Java同步代码块的要点,3 Java同步代码块的语法,4 Java同步代码块的例子1,5 Java同步代码块的例子21 什么是Java同步代码块 同步代码块可用于对方法的任何特定资源执行同步。 假设您的方法中有50行代码,但是您只想同步5行,则可以使用synchronized代码块。 如果将方法的所有代码放在同步代码块中,它的效果与同步方法相同。 2 Java同步代码块的要点 同步代码块用于锁定任何共享资源的对象。 同步代码块的范围小于该方法。 3 

  • 问题内容: 我正在使用Android App,无法将View与硬件同步。让我解释。 1)我从线程1的run方法中基于数组A中存储的随机值(即随机睡眠)对Android的麦克风进行静音和取消静音。 2)我画出反映麦克风静音的蓝色脉冲。这是通过独立的View类完成的。 3)通过从倒数计时器的onTick内调用,我在上面视图中绘制的图形上移动了一条红线。 我以这种方式一个接一个地启动两个线程: 线程1.

  • 主要内容:1 什么是Java 线程同步,2 为什么使用Java线程同步,3 Java同步类型,4 Java线程同步的类型,5 线程互斥,6 Java锁的概念,7 线程并发问题引发数据不一致,8 Java synchronized方法的例子1,9 Java synchronized方法的例子21 什么是Java 线程同步 Java中的同步是控制多个线程对任何共享资源的访问的能力。 Java同步是更好的选择,我们希望只允许一个线程访问共享资源。 2 为什么使用Java线程同步 Java线程同步主要用

  • 我有3节课是这样的: 来源Java语言 任务Java语言 主要的Java语言 当类源的x等于4时,只有一个任务继续递增x,直到x等于8,我们恢复正常。结果如下: 要获得此结果,我需要修复什么?

  • 本文向大家介绍java 线程同步详细介绍及实例代码,包括了java 线程同步详细介绍及实例代码的使用技巧和注意事项,需要的朋友参考一下 java 线程同步 概要: 为了加快代码的运行速度,我们采用了多线程的方法。并行的执行确实让代码变得更加高效,但随之而来的问题是,有很多个线程在程序中同时运行,如果它们同时的去修改一个对象,很可能会造成讹误的情况,这个时候我们需要用一种同步的机制来管理这些线程。