如果我有一个带有静态方法的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) 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?如果没有使用什么标准来获得类级别锁定?
人们讲述了两种类型的多线程锁定 - 对象和类.据我所知,锁定仅在对象上完成.
案例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)
java.lang.Class由JVM创建的对象中.因此抽象,它的对象锁定和图片中,我们看到类锁定.java.lang.Class实例)也以相同的方式工作.我想知道在同步静态方法的情况下,在以下两种情况下锁定线程获取哪个类:
到目前为止,这是我对这个问题的理解.请加上或纠正.