### [Guide to the Synchronized Keyword in Java](https://www.baeldung.com/java-synchronized)
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import lombok.Getter;
import lombok.Setter;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
public class SynchronizedMethodsTest {
@Getter
@Setter
public class SyncObject {
private int sum = 0;
public synchronized void increment() {
setSum(getSum() + 1);
}
}
@Test
public void testOnMultiThread() throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(3);
SyncObject obj = new SyncObject();
// ExecutorService 的 submit 方法用於將任務提交給執行器,從而在後台執行該任務。
// 該方法接受一個 Callable 或 Runnable 對象作為參數,並返回一個 Future 對象,可以用於獲取異步執行任務的結果或取消任務的執行。
// 通過 submit 方法,可以將任務添加到線程池中,由執行器在適當的時間執行該任務,從而有效地利用多線程處理任務。
IntStream.range(0, 1000)
.forEach(count -> service.submit(obj::increment));
// awaitTermination() 方法用於阻塞程式直到所有的任務都已完成執行、或者超過指定的等待時間。
// 通常在使用 ExecutorService 執行多個任務後,希望等待所有任務完成後再繼續執行其他操作時會使用到這個方法。
// 這可以確保所有的任務都已完成,並且可以繼續做後續的處理。
service.awaitTermination(1000, TimeUnit.MILLISECONDS);
assertThat(obj.getSum(), is(equalTo(1000))); // 使用Hamcrest進行斷言
}
}
```