Java同步修饰符

标签 java locking

我试图了解 Java 中使用同步关键字的锁是如何工作的。 如果我有一个类(忘记公共(public)变量等的不良做法等)

class Person 
{
    public int money;
    public String name;

    public void give_bonus()
    {
        synchronize(this)
        {
            money += 10;
            name = "....";
        }
    }
}

// thread one 
person.give_bonus();

// thread two
person.money += 50;

现在我的问题是,如果我使用实例锁(this)创建一个锁 block ,这会阻止其他线程操纵属性(property)资金吗?或者我是否需要将钱属性设为私有(private)并使用同步修饰符定义 getter/setter 以确保该值不会面临竞争条件的风险?

最佳答案

您提供的代码只会阻止其他线程通过 give_bonus() 方法修改 money 变量,直到该方法返回(或者更确切地说,在该方法返回之前) )。

正如您所猜测的,您必须将变量设置为私有(private),并将同步添加到 setter 方法中才能安全。只需确保您在同一个锁上进行同步即可。

关于Java同步修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16762747/

相关文章:

c++ - openmp中的重入锁

SQLITE ODBC 驱动程序和数据库锁定

c++ - 多个变量的多个互斥体

Windows 系统上的 java7 : Files. walkFileTree() 和 "System Volume information"

java - 一个组件需要一个名为 'mongoTemplate' 的 bean,但在 JUnit 5 Controller Test 中找不到

java - 读取文件的有效方法

Java - 锁定文件以进行独占访问

c# - Monitor.Enter 不会阻塞其他任务

java - 根据另一个字符串从字符串中提取数字

java - App42自定义代码实例化机制