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