What does 'synchronized' mean?

I have some questions regarding the usage and significance of the synchronized keyword.

  • What is the significance of the synchronized keyword?
  • When should methods be synchronized ?
  • What does it mean programmatically and logically?

  • The synchronized keyword is all about different threads reading and writing to the same variables, objects and resources. This is not a trivial topic in Java, but here is a quote from Sun:

    synchronized methods enable a simple strategy for preventing thread interference and memory consistency errors: if an object is visible to more than one thread, all reads or writes to that object's variables are done through synchronized methods.

    In a very, very small nutshell: When you have two threads that are reading and writing to the same 'resource', say a variable named foo , you need to ensure that these threads access the variable in an atomic way. Without the synchronized keyword, your thread 1 may not see the change thread 2 made to foo , or worse, it may only be half changed. This would not be what you logically expect.

    Again, this is a non-trivial topic in Java. To learn more, explore topics here on SO and the Interwebs about:

  • Concurrency
  • Java Memory Model
  • Keep exploring these topics until the name "Brian Goetz" becomes permanently associated with the term "concurrency" in your brain.


    Well, I think we had enough of theoretical explanations, so consider this code

    public class SOP {
        public static void print(String s) {
            System.out.println(s+"n");
        }
    }
    
    public class TestThread extends Thread {
        String name;
        TheDemo theDemo;
        public TestThread(String name,TheDemo theDemo) {
            this.theDemo = theDemo;
            this.name = name;
            start();
        }
        @Override
        public void run() {
            theDemo.test(name);
        }
    }
    
    public class TheDemo {
        public synchronized void test(String name) {
            for(int i=0;i<10;i++) {
                SOP.print(name + " :: "+i);
                try{
                    Thread.sleep(500);
                } catch (Exception e) {
                    SOP.print(e.getMessage());
                }
            }
        }
        public static void main(String[] args) {
            TheDemo theDemo = new TheDemo();
            new TestThread("THREAD 1",theDemo);
            new TestThread("THREAD 2",theDemo);
            new TestThread("THREAD 3",theDemo);
        }
    }
    

    Note: synchronized blocks the next thread's call to method test() as long as the previous thread's execution is not finished. Threads can access this method one at a time. Without synchronized all threads can access this method simultaneously.

    When a thread calls the synchronized method 'test' of the object (here object is an instance of 'TheDemo' class) it acquires the lock of that object, any new thread cannot call ANY synchronized method of the same object as long as previous thread which had acquired the lock does not release the lock.

    Similar thing happens when any static synchronized method of the class is called. The thread acquires the lock associated with the class(in this case any non static synchronized method of an instance of that class can be called by any thread because that object level lock is still available). Any other thread will not be able to call any static synchronized method of the class as long as the class level lock is not released by the thread which currently holds the lock.

    Output with synchronised

    THREAD 1 :: 0
    THREAD 1 :: 1
    THREAD 1 :: 2
    THREAD 1 :: 3
    THREAD 1 :: 4
    THREAD 1 :: 5
    THREAD 1 :: 6
    THREAD 1 :: 7
    THREAD 1 :: 8
    THREAD 1 :: 9
    THREAD 3 :: 0
    THREAD 3 :: 1
    THREAD 3 :: 2
    THREAD 3 :: 3
    THREAD 3 :: 4
    THREAD 3 :: 5
    THREAD 3 :: 6
    THREAD 3 :: 7
    THREAD 3 :: 8
    THREAD 3 :: 9
    THREAD 2 :: 0
    THREAD 2 :: 1
    THREAD 2 :: 2
    THREAD 2 :: 3
    THREAD 2 :: 4
    THREAD 2 :: 5
    THREAD 2 :: 6
    THREAD 2 :: 7
    THREAD 2 :: 8
    THREAD 2 :: 9
    

    Output without synchronized

    THREAD 1 :: 0
    THREAD 2 :: 0
    THREAD 3 :: 0
    THREAD 1 :: 1
    THREAD 2 :: 1
    THREAD 3 :: 1
    THREAD 1 :: 2
    THREAD 2 :: 2
    THREAD 3 :: 2
    THREAD 1 :: 3
    THREAD 2 :: 3
    THREAD 3 :: 3
    THREAD 1 :: 4
    THREAD 2 :: 4
    THREAD 3 :: 4
    THREAD 1 :: 5
    THREAD 2 :: 5
    THREAD 3 :: 5
    THREAD 1 :: 6
    THREAD 2 :: 6
    THREAD 3 :: 6
    THREAD 1 :: 7
    THREAD 2 :: 7
    THREAD 3 :: 7
    THREAD 1 :: 8
    THREAD 2 :: 8
    THREAD 3 :: 8
    THREAD 1 :: 9
    THREAD 2 :: 9
    THREAD 3 :: 9
    

    The synchronized keyword prevents concurrent access to a block of code or object by multiple Threads. By default, a Hashtable is synchronized , so only one thread can access the table at a time.

    On usage of non-synchronized constructs like HashMap ,you must build thread safety features in your code to prevent memory consistency errors.

    链接地址: http://www.djcxy.com/p/2676.html

    上一篇: Project Coin的收藏增强功能将在JDK8中发布吗?

    下一篇: “同步”是什么意思?