我知道要实现线程安全和同步,我们可以使用同步块或方法。
但是我听不懂这句话-
“ Java中的同步块在某些对象上被同步”
任何现实世界的示例都会有所帮助。
答案 0 :(得分:2)
3个同步关键字的用法。
明确地:
final Object object = new Object();
synchronized(object) {
}
实例同步方法
synchronized void foo() {
}
它将使用当前实例作为监视器锁定,它等于:
void foo() {
synchronized (this) {
}
}
因此,当您在不同的实例上调用foo
时,它们不会互相影响。
类同步方法
class Exmaple {
static synchronized void foo() {
}
}
它将使用当前类对象作为监视器锁定,它等于:
class Exmaple {
static void foo() {
synchronized (Exmaple.class) {
}
}
}
答案 1 :(得分:0)
在执行同步块之前,同步需要对对象进行锁定(对象级别锁或类级别锁)。
因此,Java中的同步块在获得锁定的对象上同步。
例如:
synchronized (this) // Lock on current object
synchronized (lockObject) // Lock on an object lockObject
synchronized(ClassA.class) // Lock on ClassA
答案 2 :(得分:0)
synchronized
的作用是一次只能有一个线程执行同步代码。但是,如果我们关注细节,那不是全部。
假设我们有两个向量A
和B
,并且想要从不同的线程调用各种方法。 Vector
类通过同步所有重要方法是线程安全的。当线程T1执行A.add(5,"abc")
时,为什么要阻止另一个线程执行B.get(5)
?它们没有共同的数据元素,因此并行执行两个调用不会受到损害。
这里是“在A上同步”的概念:Vector
方法在Vector
实例上同步,因此最多一个线程可以为任何给定的Vector执行同步代码 strong>。
因此向量A在A上同步,向量B在B上同步。因此,没有两个线程可以并行操纵向量A,但是一个线程可以在A上工作,而另一个线程可以在B上独立工作。
synchronized(object) { ... }
构造,您可以确定要在其上进行同步的对象。synchronized
关键字,您将在当前(this
)对象上获得同步,因此每个实例都将获得自己的同步。synchronized
关键字,可以在类上实现同步,因此可以保护该类的所有其他static synchronized
方法不受任何实例的影响。