Java支持多个线程同时访问一个对象或者对象的成员变量,synchronized 关键字可以修饰方法或者同步代码块的方法,确保多个线程在同一时刻,只能有一个线程处于方法或者同步代码块中,保证了线程对变量访问的可见性和排他性

 

public class Demo052501 {

    private static class ThreadDemo implements Runnable{
        private Integer i;

        public  ThreadDemo(Integer i){
            this.i = i;
        }
        @Override
        public void run() {
            synchronized (i){
                Thread thread = Thread.currentThread();
                System.out.println(thread.getName() + "-------"+ i+ "@----" + System.identityHashCode(this.i));
                i++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        ThreadDemo worker = new ThreadDemo(1);

        for(int i =0;i<6;i++){
            new Thread(worker).start();
        }
    }
}

预期输出:

i : 1-2-3-4-5-6

实际输出:

synchronized 不是万能,错误加锁

 

错误加锁原因:

.class 文件反编译,i++ 的代码为:

Integer.valueOf()

synchronized 不是万能,错误加锁

synchronized 不是万能,错误加锁

synchronized 内置锁,锁的是对象,保证对象唯一!!!

 

解决方法

public class Demo052501 {

    private static class ThreadDemo implements Runnable{
        private Integer i;
        private Object o = new Object();

        public  ThreadDemo(Integer i){
            this.i = i;
        }
        @Override
        public void run() {
            synchronized (o){
                Thread thread = Thread.currentThread();
                System.out.println(thread.getName() + "-------"+ i+ "@----" + System.identityHashCode(this.i));
                i++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        ThreadDemo worker = new ThreadDemo(1);

        for(int i =0;i<6;i++){
            new Thread(worker).start();
        }
    }
}

synchronized 不是万能,错误加锁

相关文章:

  • 2022-12-23
  • 2021-06-08
  • 2022-12-23
  • 2022-12-23
  • 2021-04-14
  • 2022-12-23
  • 2021-07-07
  • 2021-09-01
猜你喜欢
  • 2022-01-21
  • 2022-12-23
  • 2022-12-23
  • 2021-08-21
  • 2022-12-23
  • 2021-07-25
  • 2021-10-09
相关资源
相似解决方案