问答详情
源自:-

想问下方法内部定义锁和方法块不生效的原因是?

-------------------synchronized不生效---------------
public class tx implements Runnable{
static Integer  a=new Integer(0);
    static  int  i=0;
public void increase(){
    Integer integer = new Integer(0);
    synchronized(integer){
    i++;}
}
@Override
public void run(){
    for (int j =0 ; j<10000;j++){
        increase();
    }
}

public static void main(String[] args) throws InterruptedException {
    tx tx = new tx();
    Thread t1 = new Thread(tx);
    Thread t2 = new Thread(tx);
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    System.out.println(i);
}
----------------分割线(synchronized生效)---------------------
public class tx implements Runnable{
static Integer  a=new Integer(0);
    static  int  i=0;
     Integer integer = new Integer(0);---》放入increase方法内定义不生效
public void increase(){ 
    synchronized(integer){
    i++;}
}
@Override
public void run(){
    for (int j =0 ; j<10000;j++){
        increase();
    }
}

public static void main(String[] args) throws InterruptedException {
    tx tx = new tx();
    Thread t1 = new Thread(tx);
    Thread t2 = new Thread(tx);
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    System.out.println(i);
}


提问者:No_7479 2019-09-21 22:42

个回答

  • chenlianlian
    2019-10-10 14:37:20
    已采纳

    两个线程使用的是两个不同的锁,线程之间没有相互影响。

  • No_7479
    2019-10-29 23:40:42

    public void increase(){
        Integer integer = new Integer(0);
        synchronized(integer){
        i++;}
    }
    @Override
    public void run(){
        for (int j =0 ; j<10000;j++){
            increase();
        }
    }

    这样写每次执行run方法锁都不一样。