Java线程方法和块同步

时间:2014-07-09 14:31:22

标签: java multithreading synchronization

1)如果一个班级(比如说TestClass)有两种方法(method1method2)。两个线程(t1t2)平行运行,t1正在调用对象method1(类型object1)的TestClass,并且t2正在调用同一对象method2的{​​{1}}。

  1. 如果仅object1同步,而method1不同步,会怎样?
  2. 如果两种方法都是同步的,那么两者都会运行parelley吗? (它没有运行,但为什么?,我们可以通过两个虚拟对象和块级同步实现这一点)
  3. 在下面,同一个对象的method2method1可以与两个线程并行执行?

    method2
  4. 带有.class void method1() { synchronized(object1) { .... } } void method2() { synchronized(object1) { .... } }

  5. 的同步块的用法是什么

3 个答案:

答案 0 :(得分:1)

  1. 如果只有method1是synchronized,那么method2和method1可以并行执行。

  2. 如果两种方法都标记为synchronized,则它们无法并行运行。

  3. 我认为这里让您感到困惑的是synchronized关键字。将为该类实例同步synchronized方法。像这样:

    synchronized void Method1(){}
    synchronized void Method2(){}
    

    只有在未定义的实例未用于在其他位置执行同步代码块时,才能输入这些方法。与此相比:

    void Method1(){
        //can run in parallel 
        synchronized(this){
            //cannot run in parallel.
        }
        //can run in parallel.
    }
    void Method2(){ 
        synchronized(this){
            //cannot run in parallel.
        }
    }
    

    这不完全一样。可以输入两种方法 ,但同步块中的代码不能并行运行。

    最后,如果您在TestClass.class上进行同步,则会阻止代码在同一对象上同步执行。在同步任何静态对象时都是如此。

答案 1 :(得分:0)

  1. 他们可以同时运行
  2. 不,一次只有一个线程可以锁定对象。因此,当一个线程执行method1或method2时,没有其他trhread可以在同一个对象上执行这两个方法中的任何一个。
  3. 不,因为他们都需要锁定同一个对象来执行
  4. 防止其他threadd同时执行TestClass的静态同步方法,或同一个Class对象上的任何块同步。

答案 2 :(得分:0)

只要方法不改变共同范围内的/ any对象的状态,就不需要同步。有趣的部分在....