синхронизировать в методе stati c - это блокировка на уровне класса? - PullRequest
0 голосов
/ 19 июня 2020
public static void getResult(HttpSession session) {
    synchronized(session) {
     ....
    }
}

Здесь синхронизированный блок находится в сеансе, но метод является статическим c. Приводит ли это к блокировке на уровне класса?

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Поток будет блокировать объект session, который вы использовали в synchronized(session). В вашем случае не имеет значения, является ли метод stati c или нет , в обоих случаях блокировка будет на объекте сеанса.

0 голосов
/ 19 июня 2020

Чтобы ответить на ваш вопрос: это блокировка на уровне класса? Ответ: хм, нет :)

Здесь разные потоки могут синхронизировать c на разных объектах, поскольку блокировка передается как параметр метода.

Пара примеров:

public class DemoClass
{
    //Method is static
    public synchronized static void demoMethod(){

    }
}

or

public class DemoClass
{
    public void demoMethod()
    {
        //Acquire lock on .class reference
        synchronized (DemoClass.class)
        {
            //other thread safe code
        }
    }
}

or

public class DemoClass
{
    private final static Object lock = new Object();

    public void demoMethod()
    {
        //Lock object is static
        synchronized (lock)
        {
            //other thread safe code
        }
    }
}

Синхронизация увеличивает нагрузку на вашу программу. В веб-приложении это одна из функций, которые за вас берет на себя контейнер приложения. Несмотря на то, что вы можете охватить собственные потоки в веб-приложении, это не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...