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
实际输出:
错误加锁原因:
.class 文件反编译,i++ 的代码为:
Integer.valueOf()
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(); } } }