如何在Kotlin随播对象中设置线程安全全局变量?

时间:2019-12-17 09:03:07

标签: kotlin global-variables

我想在伴侣对象中设置一个可变变量,并以静态方式在其他方法中使用它。

class GlobalVariable {
    companion object {
        private var flag = false

        fun modifyFlag(){
          flag = setFlagValue() //this method written in other class to assign value to the flag
        }
        fun getVal(): Boolean = this.flag // this is to get flag value in other methods static way, like GlobalVariable.getVal()
    }
}

flag是我需要的变量,我将在其他方法中调用modifyFlag()方法,将值设置为标志,然后在需要时使用GlobalVariable.getVal()

不确定以这种方式是否是线程安全的。 还有其他方法可以在Kotlin中设置全局变量吗?

1 个答案:

答案 0 :(得分:0)

我认为,如果您在JVM上运行Kotlin应用程序,则应尝试此操作。注释@Synchronized将锁定方法,因此在执行方法时线程将不会访问静态类。

class GlobalVariable {
    companion object {
        private var mutex = Object()
        private var flag = false

        @Synchronized fun modifyFlag(){
            flag = setFlagValue()
        }

        @Synchronized fun getVal(): Boolean = this.flag
    }
}

您也可以使用同步块,但是,由于官方文档的缘故,并非所有平台都支持任何对象上的同步,因此很快就会从标准库中删除它。

class GlobalVariable {
    companion object {
        private var mutex = Object()
        private var flag = false

        private val mutex = Any()

        fun modifyFlag(){
            synchronized(mutex) {
                flag = setFlagValue()
            }
        }

        fun getVal(): Boolean {
            synchronized(mutex) {
                return flag;
            }
        }
    }
}

在这里,同步块仅允许一个线程同时获取互斥量。拥有互斥量的线程将执行该方法,而不会被其他线程中断或参与竞争