Is there an advantage to use a Synchronized Method instead of a Synchronized Block?

后端 未结 23 2006
北荒
北荒 2020-11-22 04:29

Can any one tell me the advantage of synchronized method over synchronized block with an example?

23条回答
  •  遥遥无期
    2020-11-22 05:08

    Synchronizing with threads. 1) NEVER use synchronized(this) in a thread it doesn't work. Synchronizing with (this) uses the current thread as the locking thread object. Since each thread is independent of other threads, there is NO coordination of synchronization. 2) Tests of code show that in Java 1.6 on a Mac the method synchronization does not work. 3) synchronized(lockObj) where lockObj is a common shared object of all threads synchronizing on it will work. 4) ReenterantLock.lock() and .unlock() work. See Java tutorials for this.

    The following code shows these points. It also contains the thread-safe Vector which would be substituted for the ArrayList, to show that many threads adding to a Vector do not lose any information, while the same with an ArrayList can lose information. 0) Current code shows loss of information due to race conditions A) Comment the current labeled A line, and uncomment the A line above it, then run, method loses data but it shouldn't. B) Reverse step A, uncomment B and // end block }. Then run to see results no loss of data C) Comment out B, uncomment C. Run, see synchronizing on (this) loses data, as expected. Don't have time to complete all the variations, hope this helps. If synchronizing on (this), or the method synchronization works, please state what version of Java and OS you tested. Thank you.

    import java.util.*;
    
    /** RaceCondition - Shows that when multiple threads compete for resources 
         thread one may grab the resource expecting to update a particular 
         area but is removed from the CPU before finishing.  Thread one still 
         points to that resource.  Then thread two grabs that resource and 
         completes the update.  Then thread one gets to complete the update, 
         which over writes thread two's work.
         DEMO:  1) Run as is - see missing counts from race condition, Run severa times, values change  
                2) Uncomment "synchronized(countLock){ }" - see counts work
                Synchronized creates a lock on that block of code, no other threads can 
                execute code within a block that another thread has a lock.
            3) Comment ArrayList, unComment Vector - See no loss in collection
                Vectors work like ArrayList, but Vectors are "Thread Safe"
             May use this code as long as attribution to the author remains intact.
         /mf
    */ 
    
    public class RaceCondition {
        private ArrayList raceList = new ArrayList(); // simple add(#)
    //  private Vector raceList = new Vector(); // simple add(#)
    
        private String countLock="lock";    // Object use for locking the raceCount
        private int raceCount = 0;        // simple add 1 to this counter
        private int MAX = 10000;        // Do this 10,000 times
        private int NUM_THREADS = 100;    // Create 100 threads
    
        public static void main(String [] args) {
        new RaceCondition();
        }
    
        public RaceCondition() {
        ArrayList arT = new ArrayList();
    
        // Create thread objects, add them to an array list
        for( int i=0; i

提交回复
热议问题