public class Constants {
public static int syncIntValue = 0;
public static int syncIntValueExecCount = 0;
}
public class MyRun implements Runnable {
private String name;
public MyRun(String name) {
this.name = name;
}
public void run() {
printSyncIntValue();
}
public synchronized void printSyncIntValue() {
while( Constants.syncIntValue%2 ==0){
Constants.syncIntValue++;
Constants.syncIntValue++;
}
System.out.println(Constants.syncIntValue);
}
}
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 5486; i++) {
Thread t = new Thread(new MyRun("syncIntValue"));
t.start();
}
}
}
上面的代码达不到同步的效果,相当于每个线程拥有的是它自己的锁,互不影响,从而跟没加锁一样,可以随意访问公共资源。修改如下:
public void printSyncIntValue() {
synchronized (name) {
while( Constants.syncIntValue%2 ==0){
Constants.syncIntValue++;
Constants.syncIntValue++;
}
}
System.out.println(Constants.syncIntValue);
}
或者是:
public void printSyncIntValue() {
synchronized ("kkk") {
while( Constants.syncIntValue%2 ==0){
Constants.syncIntValue++;
Constants.syncIntValue++;
}
}
System.out.println(Constants.syncIntValue);
}
不管是name还是字母常量,它都是唯一的对象,其他线程在执行该方法之前必须先获得对象锁。
public static int syncIntValue = 0;
public static int syncIntValueExecCount = 0;
}
public class MyRun implements Runnable {
private String name;
public MyRun(String name) {
this.name = name;
}
public void run() {
printSyncIntValue();
}
public synchronized void printSyncIntValue() {
while( Constants.syncIntValue%2 ==0){
Constants.syncIntValue++;
Constants.syncIntValue++;
}
System.out.println(Constants.syncIntValue);
}
}
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 5486; i++) {
Thread t = new Thread(new MyRun("syncIntValue"));
t.start();
}
}
}
上面的代码达不到同步的效果,相当于每个线程拥有的是它自己的锁,互不影响,从而跟没加锁一样,可以随意访问公共资源。修改如下:
public void printSyncIntValue() {
synchronized (name) {
while( Constants.syncIntValue%2 ==0){
Constants.syncIntValue++;
Constants.syncIntValue++;
}
}
System.out.println(Constants.syncIntValue);
}
或者是:
public void printSyncIntValue() {
synchronized ("kkk") {
while( Constants.syncIntValue%2 ==0){
Constants.syncIntValue++;
Constants.syncIntValue++;
}
}
System.out.println(Constants.syncIntValue);
}
不管是name还是字母常量,它都是唯一的对象,其他线程在执行该方法之前必须先获得对象锁。