markdown-it
demo
Delete
Submit
clear
permalink
### [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進行斷言 } } ```
html
source
debug
Fork me on GitHub