Here we are going to share two common as well as efficient ways to synchronize ArrayList in Java.
Using Collections.synchronizedList():
The Collections.synchronizedList() method returns a thread-safe ArrayList backed by a specific list.
Source code:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class SyncronizeArrayList {
    
    public static void main(String[] args) {
        
        List languageList = new ArrayList<>(Arrays.asList("Java", "Python", "HTML", "CSS"));
        // Synchronizing ArrayList in Java  
        languageList = Collections.synchronizedList(languageList);  
  
        // we must use synchronize block to avoid non-deterministic behavior  
        synchronized (languageList) {  
            Iterator iterator = languageList.iterator();  
            while (iterator.hasNext()) {  
                System.out.println(iterator.next());  
            }  
        }  
    }
}
Output:
run:
Java
Python
HTML
CSS
BUILD SUCCESSFUL (total time: 12 seconds)
Initializing thread-safe list:
Rather than synchronizing an ArrayList, you can also declare or initialize a thread-safe list.
Source code:
import java.util.Arrays;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class SyncronizeArrayList {
    public static void main(String[] args) {
        // Initializing a thread-safe Arraylist.
        CopyOnWriteArrayList list = 
                           new CopyOnWriteArrayList(Arrays.asList("John", "Sara", "Ali", "Sam"));
        System.out.println("Following are elements of synchronized ArrayList: ");
        // Using iterator for Iterating on the synchronized ArrayList.
        Iterator itr = list.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }
}
Output:
run:
Following are elements of synchronized ArrayList: 
John
Sara
Ali
Sam
BUILD SUCCESSFUL (total time: 2 seconds)
