相关疑难解决方法(0)

同步静态方法如何在Java中工作?

如果我有一个带有静态方法的util类,它将调用Hibernate函数来完成基本的数据访问.我想知道是否使用该方法synchronized是确保线程安全的正确方法.

我希望这可以防止信息访问同一个数据库实例.但是,我现在确定以下代码是否阻止getObjectById在特定类调用所有类时调用它们.

public class Utils {
     public static synchronized Object getObjectById (Class objclass, Long id) {
           // call hibernate class
         Session session = new Configuration().configure().buildSessionFactory().openSession();
         Object obj = session.load(objclass, id);
         session.close();
         return obj;
     }

     // other static methods
}
Run Code Online (Sandbox Code Playgroud)

java multithreading synchronization hibernate

172
推荐指数
5
解决办法
19万
查看次数

如何获取类级别锁定

public synchronized int getCountOne() {
        return count++;
 }
Run Code Online (Sandbox Code Playgroud)

与上面的代码一样,在方法上的同步在功能上等同于在方法synchronized (this) block的主体周围.对象"this"不会被锁定,而是将"this"作为对象使用,mutex并防止正文与同时在"this"上同步的其他代码段同时执行.

在类似的理由上,mutex当我们获得一个类级锁时,我们会使用它.如果我们有一个函数

public static synchronized int getCountTwo() {
        return count++;
 }
Run Code Online (Sandbox Code Playgroud)

显然,两个线程可以同时获取getCountOne(对象级别锁定)和getCountTwo(类级别锁定)的锁定.因此getCountOne类似于

public int getCountOne() {
     synchronized(this) {
          return count++;
     }
 }
Run Code Online (Sandbox Code Playgroud)

是否有相当于getCountTwo?如果没有使用什么标准来获得类级别锁定?

java static synchronization locking

7
推荐指数
1
解决办法
3262
查看次数

Java中类锁定和对象锁定的区别

人们讲述了两种类型的多线程锁定 - 对象和类.据我所知,锁定仅在对象上完成.

案例1:我们使用的工具new或工厂方法等.

void synchronized myMethod(Type param) {
  //will lock on the instance used to call this method
}
Run Code Online (Sandbox Code Playgroud)

要么

synchronized(this) {
 //will lock on current object
}
Run Code Online (Sandbox Code Playgroud)

要么

synchronized(obj1) {
 //will lock on specified obj1 object
}
Run Code Online (Sandbox Code Playgroud)

案例2:java.lang.Class对象

这称为类锁,可以与静态字段或方法或块一起使用,因为它们属于类并在所有对象和其他类属性之间共享.

static void synchronized method() {
  //will lock the Class object
}
Run Code Online (Sandbox Code Playgroud)

要么

static {
  synchronized(SomeClass.class){
    int a = 2;
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 为什么我还将此视为对象锁定,因为类被加载到JVM中的方法区域中,并且类的所有静态属性都包装在java.lang.Class由JVM创建的对象中.因此抽象,它的对象锁定和图片中,我们看到类锁定.
  • 所以我还可以推断出一件事.正如一个线程锁定的对象不能被另一个线程获取,只要它不被第一个线程释放,类锁定(java.lang.Class实例)也以相同的方式工作.
  • 我想知道在同步静态方法的情况下,在以下两种情况下锁定线程获取哪个类:

    1. 从定义它的同一个类调用此方法.
    2. 从具有派生类名的派生类调用此方法.

到目前为止,这是我对这个问题的理解.请加上或纠正.

java multithreading locking thread-synchronization

7
推荐指数
2
解决办法
2万
查看次数