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

来源:-

No_7479

2019-09-21 22:42

-------------------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);
}


写回答 关注

2回答

  • 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方法锁都不一样。

Java高并发之魂:synchronized深度解析

从0开始彻底学会高并发场景下不得不会的synchronized

36591 学习 · 27 问题

查看课程

相似问题