Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步属性获取程序/设置程序_Java_Kotlin - Fatal编程技术网

Java 同步属性获取程序/设置程序

Java 同步属性获取程序/设置程序,java,kotlin,Java,Kotlin,所以我试图弄清楚Kotlin是如何处理属性同步的。如果我有这门课: class Foo { var a = 0 var b = 0 } 我想确保a&b的所有访问都是同步的。我该怎么做?我已尝试使用注释: class Foo { @Synchronized var a = 0 @Synchronized var b = 0 } 但是Kotlin给了我一个编译器错误: 此批注不适用于目标“具有支持字段的成员属性” 我只是想更好地处理Kotlin中的

所以我试图弄清楚Kotlin是如何处理属性同步的。如果我有这门课:

class Foo {
    var a = 0
    var b = 0
}
我想确保a&b的所有访问都是同步的。我该怎么做?我已尝试使用注释:

class Foo {
    @Synchronized
    var a = 0
    @Synchronized
    var b = 0
}
但是Kotlin给了我一个编译器错误:

此批注不适用于目标“具有支持字段的成员属性”


我只是想更好地处理Kotlin中的线程安全问题。这是我在Java中一直关注的问题,我正试图找出如何在Kotlin中正确处理它。

您不能在属性上同步,但可以在访问器方法上同步。使用以下语法:

class Foo {
    var a = 0
        @Synchronized get
        @Synchronized set   

    //or

    @get:Synchronized @set:Synchronized
    var b = 0
}

在@Kirill-Rakhman的回答之后,如果对同一对象存在大量争用,则使用委托可能会更有效,因为它锁定的是委托而不是整个对象

class Foo {
    var a by Synchronize(0)
    var b by Synchronize(0)
}

class Synchronize<T>(defaultValue: T): ReadWriteProperty<Any, T> {
    private var backingField = defaultValue

    override fun getValue(thisRef: Any, property: KProperty<*>): T {
        return synchronized(this) {
            backingField
        }
    }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
        synchronized(this) {
            backingField = value
        }
    }
}
class-Foo{
var a通过同步(0)
var b通过同步(0)
}
类同步(默认值:T):ReadWriteProperty

此语法是否一直在Kotlin中?如果没有,它引入了什么版本?我想它总是存在的。它是锁定在
Foo
上还是锁定在创建的setter和getter函数上?@stk实例函数不是对象,所以不能锁定它们。因此,它必须锁定
Foo
实例。为什么这不是sdk的一部分?它看起来很有用。。。这种方法有什么问题吗?我正在使用这种方法,到目前为止没有问题。也许以后会加上。希望如此。