这段代码在做什么
what is this piece of code doing
public int synchronizedBlockGet() {
synchronized( this ) {
return i;
}
}
我在阅读一些文章时遇到了这段代码。什么是同步? a class ,或方法或接口?请解释。
它是一个关键字,一次只允许一个线程进入块。
它将通过获取此对象的锁来实现。
当您处理 线程 时,就会出现同步或一般同步。例如,假设您的程序中有 2 个线程。这两个线程都使用同一个对象。 (考虑一个场景,其中一个线程正在写入 ArrayList 而另一个线程正在从中读取)。在这些情况下,我们必须确保另一个线程在一个线程写入列表时不进行读取或写入。这是因为,写入列表将至少包含 3 个步骤
- 从内存读取
- 修改对象(列表)
- 写回内存。
为了保证这些线程不被拦截,不会造成不一致,我们使用了线程同步的概念。
有几种方法可以实现同步,包括同步方法和同步块。您提供的代码是一个同步块。
public int synchronizedBlockGet() {
synchronized( this ) {
return i;
}
}
这里发生的事情是,一旦一个线程在 synchronizedBlockGet 方法中,它将 lock 整个对象(称为 正在获取对象的锁)上面方法所在的地方。
synchronized(this)
表示当前线程会锁住整个对象。因此,在当前线程离开同步块并释放该对象之前,没有其他线程可以访问该对象。虽然你举的例子不是同步的必要情况,但后面发生的事情是一样的。
public int synchronizedBlockGet() {
synchronized( this ) {
return i;
}
}
我在阅读一些文章时遇到了这段代码。什么是同步? a class ,或方法或接口?请解释。
它是一个关键字,一次只允许一个线程进入块。
它将通过获取此对象的锁来实现。
当您处理 线程 时,就会出现同步或一般同步。例如,假设您的程序中有 2 个线程。这两个线程都使用同一个对象。 (考虑一个场景,其中一个线程正在写入 ArrayList 而另一个线程正在从中读取)。在这些情况下,我们必须确保另一个线程在一个线程写入列表时不进行读取或写入。这是因为,写入列表将至少包含 3 个步骤
- 从内存读取
- 修改对象(列表)
- 写回内存。
为了保证这些线程不被拦截,不会造成不一致,我们使用了线程同步的概念。
有几种方法可以实现同步,包括同步方法和同步块。您提供的代码是一个同步块。
public int synchronizedBlockGet() {
synchronized( this ) {
return i;
}
}
这里发生的事情是,一旦一个线程在 synchronizedBlockGet 方法中,它将 lock 整个对象(称为 正在获取对象的锁)上面方法所在的地方。
synchronized(this)
表示当前线程会锁住整个对象。因此,在当前线程离开同步块并释放该对象之前,没有其他线程可以访问该对象。虽然你举的例子不是同步的必要情况,但后面发生的事情是一样的。