没有synchronized的效果:
package Action;
public class syn {
static int count=10;
static Object lock=new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if(count<=0) {
System.out.println("内部线程:结束");
break;
}
// synchronized(lock) {
count--;
System.out.println("内部线程:"+count);
// }
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
while (true) {
if(count<=0) {
System.out.println("外部线程:结束");
break;
}
// synchronized (lock) {
count--;
System.out.println("外部线程:"+count);
// }
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
很明显,在没有使用【锁】的时候数据出现了错误。
有synchronized的效果:
package Action;
public class syn {
static int count=10;
static Object lock=new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if(count<=0) {
System.out.println("内部线程:结束");
break;
}
synchronized(lock) {
count--;
System.out.println("内部线程:"+count);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
while (true) {
if(count<=0) {
System.out.println("外部线程:结束");
break;
}
synchronized (lock) {
count--;
System.out.println("外部线程:"+count);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
效果很明显,没有数据错误。
synchronized不仅可以修饰代码块,还可以修饰方法、实例对象、class对象。
如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系。