Avoid synchronized(this) in Java?

后端 未结 22 1237
予麋鹿
予麋鹿 2020-11-22 01:23

Whenever a question pops up on SO about Java synchronization, some people are very eager to point out that synchronized(this) should be avoided. Instead, they c

22条回答
  •  走了就别回头了
    2020-11-22 02:01

    I only want to mention a possible solution for unique private references in atomic parts of code without dependencies. You can use a static Hashmap with locks and a simple static method named atomic() that creates required references automatically using stack information (full class name and line number). Then you can use this method in synchronize statements without writing new lock object.

    // Synchronization objects (locks)
    private static HashMap locks = new HashMap();
    // Simple method
    private static Object atomic() {
        StackTraceElement [] stack = Thread.currentThread().getStackTrace(); // get execution point 
        StackTraceElement exepoint = stack[2];
        // creates unique key from class name and line number using execution point
        String key = String.format("%s#%d", exepoint.getClassName(), exepoint.getLineNumber()); 
        Object lock = locks.get(key); // use old or create new lock
        if (lock == null) {
            lock = new Object();
            locks.put(key, lock);
        }
        return lock; // return reference to lock
    }
    // Synchronized code
    void dosomething1() {
        // start commands
        synchronized (atomic()) {
            // atomic commands 1
            ...
        }
        // other command
    }
    // Synchronized code
    void dosomething2() {
        // start commands
        synchronized (atomic()) {
            // atomic commands 2
            ...
        }
        // other command
    }
    

提交回复
热议问题