当前位置: 首页 > 面试题库 >

将参数传递到同步块的目的是什么?

蓝宜
2023-03-14
问题内容

我知道

同步代码块时,可以指定要将哪个对象的锁用作锁,例如,可以将某些第三方对象用作此代码段的锁。这样一来,您就可以在一个对象中拥有多个锁来进行代码同步。

但是,我不明白需要将参数传递给该块。因为我是否传递String的实例都没有关系,所以某些随机类的实例作为同步块可以完美地工作,而与传递给该块的参数无关。

所以我的问题是 ,无论如何,同步块是否阻止两个线程同时进入关键部分。 那为什么要传递一个论点呢?(我的意思是默认情况下获取对某些随机对象的锁定)。

我希望我正确地提出了问题。

我尝试了以下示例,将随机参数设置为同步块。

public class Launcher {

    public static void main(String[] args) {
        AccountOperations accOps=new AccountOperations();

        Thread lucy=new Thread(accOps,"Lucy");
        Thread sam=new Thread(accOps,"Sam");

        lucy.start();
        sam.start();

    }

}

使用非静态同步块:

public class AccountOperations implements Runnable{
    private  Account account = new Account();


    public void run(){

        for(int i=0;i<5;i++){

            makeWithdrawal(10);                 
        }
    }

    public  void makeWithdrawal(int amount){
        String str="asd"
        synchronized (str /* pass any non-null object the synchronized block works*/) {
            if(account.getAmount()>10){

                try{
                    Thread.sleep(5000);             
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                account.withdraw(amount);
                System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());
            }else{
                System.out.println("Insufficient funds "+account.getAmount());
            }
        }

    }

}

使用静态同步块:

public class AccountOperations implements Runnable{
    private static Account account = new Account();


    public void run(){

        for(int i=0;i<5;i++){

            makeWithdrawal(10);                 
        }
    }

    public static void makeWithdrawal(int amount){

        synchronized (String.class /* pass any class literal synchronized block works*/) {
            if(account.getAmount()>10){

                try{
                    Thread.sleep(5000);             
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                account.withdraw(amount);
                System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());
            }else{
                System.out.println("Insufficient funds "+account.getAmount());
            }
        }

    }

}

问题答案:

如果仍然同步块将阻止两个线程同时进入关键部分。那么为什么需要传递一个论点呢?

同步块根据传递给它的对象来决定停止哪些线程。传递的对象用作由同步块保护的监视部分的标识符。

您的程序中可能有许多监视部分,所有这些监视部分可以相互并行执行。例如,如果有两个不相关的集合必须同时访问,则可以为每个集合设置单独的监视器部分。这样,仅当其他线程已经在访问同一集合时,线程才停止。访问两个不同集合的两个不同线程将被允许并发进行。

您的第一个例子很简单。它起作用的原因是将字符串对象初始化为字符串文字。由于文字的内插,所有进入该函数的线程都将获得相同的String对象,因此同步块将适当地保护监视部分。



 类似资料:
  • 我知道 当您同步一个代码块时,您可以指定要使用哪个对象的锁作为锁,这样,例如,您可以使用某个第三方对象作为这段代码的锁。这使您能够在单个对象中拥有多个用于代码同步的锁。 但是,我不明白是否需要将参数传递给块。因为我是否传递String的实例并不重要,一些随机类的实例传递给同步块,因为同步块可以完美地工作,而不管传递给块的参数如何。 所以我的问题是,如果无论如何同步块阻止两个线程同时进入关键部分。那

  • 问题内容: 这里的同步点是什么? 为什么不只是使用? 该代码段来自Android的BluetoothChat示例(在此处找到) 问题答案: 需要进行同步以确保您没有不一致的状态。 没有同步,代码将是: 现在,如果在执行方法调用之前将if语句检查和方法调用之间的连接从何处关闭,则可以将其分配为null。这将导致。

  • 我是Web应用程序的新手。我的问题:如何将相同的参数从一个JSP传递到两个servlet?然后将不同的参数从servlet传递到同一个JSP? 重要!!我们应该先做过程A,然后再做过程B!!!! 由于项目需要太多进程,我想将这些进程分成两个servlet。 目前,我完成了实现进程A,它将搜索词从SEARCH PAGE JSP传递到SERVLET A(执行进程A)并将结果传递给WELCOME PAG

  • 问题内容: 通常,我会使用一个JavaScript文件,该文件需要在网页中定义某些变量。 所以代码是这样的: 但是我想做的是: 我尝试了不同的方法,最好的方法是解析查询字符串,如下所示: 然后搜索我的价值观。 我想知道是否还有另一种方法可以执行此操作而无需构建函数来解析我的字符串。 你们都知道其他方法吗? 问题答案: 如果可能,我建议不要使用全局变量。使用名称空间和OOP将参数传递给对象。 此代码

  • 问题内容: 我想将值传递给javascript。如果可能的话,我该怎么办?如何在后备bean中接收它们? 问题答案:

  • 问题内容: 我们已经设置了一些参数来在Jenkins中执行构建(使用简单的“参数化构建”设置)。作业被设置为Maven测试。有没有办法以编程方式将这些参数传递到我们的Java代码中?我们需要基于通过Jenkins设置的参数来执行某些更新功能。 问题答案: 是的,您可以通过Maven执行将Jenkins参数传递给Java代码,如下所示: 请注意, $ JOB_PARAM_1 将捕获Jenkins上设