title: What is the reason why “synchronized” is not allowed in Java 8 interface methods?
body: <p>In Java 8, I can easily write: </p>
  
  <pre><code>interface Interface1 {
      default void method1() {
          synchronized (this) {
              // Something
          }
      }
  
      static void method2() {
          synchronized (Interface1.class) {
              // Something
          }
      }
  }
  </code></pre>
  
  <p>I will get the full synchronisation semantics that I can use also in classes. I cannot, however, use the <code>synchronized</code> modifier on method declarations:</p>
  
  <pre><code>interface Interface2 {
      default synchronized void method1() {
          //  ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
      }
  
      static synchronized void method2() {
          // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
      }
  }
  </code></pre>
  
  <p>Now, one can argue that the two interfaces behave the same way except that <code>Interface2</code> establishes a <em>contract</em> on <code>method1()</code> and on <code>method2()</code>, which is a bit stronger than what <code>Interface1</code> does. Of course, we might also argue that <code>default</code> implementations should not make any assumptions about concrete implementation state, or that such a keyword simply wouldn't pull its weight.</p>
  
  <h3>Question:</h3>
  
  <p>What is the reason why the JSR-335 expert group decided not to support <code>synchronized</code> on interface methods?</p>