对象和实例是一样的东西吗?

时间:2018-07-01 06:28:39

标签: java synchronization

在阅读有关同步的内容时,我阅读了锁定在类对象上的静态同步方法以及关于对象的当前实例的同步方法。 我很困惑什么是类对象和对象实例?反对与实例是不是同一回事?

3 个答案:

答案 0 :(得分:2)

对于每个装入JVM的类,将创建类Class的实例。 例如: 学生=新学生()

当上面的代码行将执行的类(Student)首先加载到JVM中时,bcz JVM需要模板来创建对象。然后基于JVM在堆中创建Student的实例。与Student实例一起,JVM在堆中创建Class类的实例该类实例化了所有有关STudent的信息,例如我们用于反射的构造函数,方法,变量等的数量。

现在,所有创建的实例(对象)将具有一个与then关联的锁,当执行同步的方法或块(可以是静态或实例)时,该锁就会出现。如果您在同步上下文中执行任何静态方法,则将获取(STudent的)Class类的锁,直到完成。

答案 1 :(得分:1)

那里的操作词是 class 。每个类都有一个java.lang.Class实例,该实例在当前类加载器中表示该实例。

考虑以下简单示例:

            var handler = StripeCheckout.configure({
              key: 'pk_test_6pRNASCoBOKtIshFeQd4XMUh',
              token: function(token) {
                $("#stripeToken").val(token.id);
                $("#stripeEmail").val(token.email);
                $("#cartTotal").val(totalCost);
                    $("#cartContents").val(finalCartLoad);
                    $("#userShippingA").val(token.shippingAddress);
                    $("#userBillingA").val(token.billingAddress);   
                $("#paymentForm").submit();
              }
            });


  return stripe.charges.create({
// ensures we send a number, and not a string
amount: parseInt(process.env.STRIPE_COST, 10),
currency: process.env.STRIPE_CCY,
source: token,
description: req.body.cartContents,
shippingAddress: req.body.shippingAddress,
billingAddress: req.body.billingAddress,
email: req.body.stripeEmail,

答案 2 :(得分:1)

我认为无论您从这里读到什么,都可以用更好的方式表达出来。

同步实例方法和同步静态方法之间的区别在于,后者“锁定”了该类,而前者锁定了在其上调用了同步方法的该类的实例。有关更多信息,请参见此answer

假设作者知道他/她在说什么,“类对象”一词会引起混淆,因为类本身不是对象。他/她是否在谈论SELECT SUM(amount) FROM table WHERE tag_1 = 'id1' and time > X AND time < Y的实例?可能不会。作者应该刚才说过“班级”。

关于同步上下文之外的“对象”和“实例”之间的区别,它们的含义实际上是相同的-通过调用构造函数(和字符串文字)创建的那些东西。

我个人认为,“对象”一词具有较高的抽象水平。当我在较低的抽象级别上进行讨论时(例如,讨论各行代码,例如“我在这里通过编写Class<T>创建了Foo的实例”),我会使用“实例”。当我在更高层次上谈论事物时(例如整个系统如何工作),我倾向于使用“对象”。但这可能只是我。其他人可能会交替使用它们。