为什么同步关键字不使用原始变量。仅用于方法和同步块

时间:2014-04-17 11:22:59

标签: java synchronized

在java中有一个synchronize keyword,用于避免一次多线程访问方法或同步块。

我的问题是,synchronize keyword为什么不与原始变量一起使用?我知道java不允许带有变量的synchronized关键字。但我的问题是为什么java不允许带有变量的synchronize关键字。如果我们将synchronize关键字与变量?

一起使用,会出现什么问题

原始变量类似于int,float等。

e.g。

int a=1
synchronized(a)

4 个答案:

答案 0 :(得分:1)

变量本身并不是独立的。它需要一个类来拥有一些上下文。这就是为什么锁在类或对象上而不在变量上的原因。

答案 1 :(得分:0)

您也可以同步变量。

synchronized(myvariable) {
.......
}

另外,您应该检查'volatile'关键字。 http://en.wikipedia.org/wiki/Volatile_variable#In_Java

答案 2 :(得分:0)

你的意思是说你需要对变量进行同步操作?就像你想保护变量操作一样增量,减量? java有像java.util.concurrent.AtomicBoolean等原子API。

使用Atomic Concurrency类的好处是我们不需要担心我们处理整数的每个地方的同步,并且假设涉及锁定资源的同步更有效。

答案 3 :(得分:0)

我想通过变量,你的意思是类字段。但这不是Java中同步的工作方式。

synchronized块或方法的目的是防止多个线程同时更改类变量的状态。 Java中的同步通过拥有锁来工作 - 如果您有同步方法,则使用对象的内部锁,否则您必须提供锁。如果要将字段声明为synchronized,那么或多或少会强制该类中使用该字段的所有方法通过拥有锁来以同步方式工作,这对性能不利。

如果您在字段级别寻找同步保证而不必同步方法,请考虑使用java.util.concurrent.atomic.AtomicInteger之类的Atomic variables