Is synchronized inherited in Java?

后端 未结 3 1127
迷失自我
迷失自我 2020-12-03 02:29

I have superclass Point and a synchronized method draw(). Will the subclasses of Point inherit synchronized

相关标签:
3条回答
  • 2020-12-03 03:09

    No, you will always have to write synchronized. If you call the synchronized method of the super class this will of course be a synchronized call. synchronized is not part of the method signature.

    See http://gee.cs.oswego.edu/dl/cpj/mechanics.html for detailed description from Doug Lea, Java threading boss (or so).

    0 讨论(0)
  • 2020-12-03 03:10

    your Overriden method will no longer be synchronized if you Override it and remove the synchronized. Found it here and here

    0 讨论(0)
  • 2020-12-03 03:11

    You can check it yourself by writing this:

    public class Shape {
    
        protected int sum = 0;
    
        public synchronized void add(int x) {
            sum += x;
        }
    }
    
    
    public class Point extends Shape{
    
        public void add(int x) {
            sum += x;
        }
    
        public int getSum() {
            return sum;
        }
    }
    

    And test class

    public class TestShapes {
    
        public final static int ITERATIONS = 100000;
    
        public static void main(String[] args) throws InterruptedException {
    
            final Point p = new Point();
    
            Thread t1 = new Thread(){
                @Override
                public void run() {
    
                    for(int i=0; i< ITERATIONS; i++){
                        p.add(1);
                    }
                }
            };
    
            Thread t2 = new Thread(){
                @Override
                public void run() {
    
                    for(int i=0; i< ITERATIONS; i++){
                        p.add(1);
                    }
                }
            };
    
            t1.start();
            t2.start();
    
            t1.join();
            t2.join();
    
    
            System.out.println(p.getSum()); // should equal 200000
    
        }
    }
    

    On my machine it was 137099 instead of 200000.

    0 讨论(0)
提交回复
热议问题