第一篇随笔 写下 Java synchronized

Todo

1. 对比下 有无 synchronized的 运行结果, 就会发现 不同的线程 同时修改 同一个对象的某条属性 就会导致错乱。 因为某些线程修改的结果被覆盖了。

所以我们要加上 synchronized 来保证 互斥访问

```

class Account {

private String name;
private float amount;

public Account(String name, float amount) {
this.name = name;
this.amount = amount;
}

public String getName() {
return name;
}

public float getBalance() {
return amount;
}

public void deposit(float amt) {
float temp = amount;
temp -= amt;

try {
//模拟其它处理所需要的时间,比如刷新数据库等
Thread.sleep((int) (Math.random() * 10));
} catch (InterruptedException e) {
e.printStackTrace();
}

amount = temp;
}

public void withdraw(float amt) {
float temp = amount;
temp += amt;

try {
Thread.sleep((int) (Math.random() * 10));
} catch (InterruptedException e) {
e.printStackTrace();
}

amount = temp;
}


}

public class Bank {
private static int NUM_OF_THREAD = 1000;
static Thread[] threads = new Thread[NUM_OF_THREAD];

public static void main(String[] args) {
Account acc = new Account("Francis", 1000.0f);

for (int i = 0; i < NUM_OF_THREAD; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
acc.deposit(100.0f);
acc.withdraw(100.0f);
}
});
threads[i].start();
}

for (int i = 0; i < NUM_OF_THREAD; i++) {
try {
// 等待 所有线程运行结束
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(String.format("Finally, %s's balance is: %f", acc.getName(), acc.getBalance()));
}
}
```

```

class Account {

private String name;
private float amount;

public Account(String name, float amount) {
this.name = name;
this.amount = amount;
}

public String getName() {
return name;
}

public float getBalance() {
return amount;
}

public synchronized void deposit(float amt) {
float temp = amount;
temp -= amt;

try {
//模拟其它处理所需要的时间,比如刷新数据库等
Thread.sleep((int) (Math.random() * 10));
} catch (InterruptedException e) {
e.printStackTrace();
}

amount = temp;
}

public synchronized void withdraw(float amt) {
float temp = amount;
temp += amt;

try {
Thread.sleep((int) (Math.random() * 10));
} catch (InterruptedException e) {
e.printStackTrace();
}

amount = temp;
}


}

public class Bank {
private static int NUM_OF_THREAD = 1000;
static Thread[] threads = new Thread[NUM_OF_THREAD];

public static void main(String[] args) {
Account acc = new Account("Francis", 1000.0f);

for (int i = 0; i < NUM_OF_THREAD; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
acc.deposit(100.0f);
acc.withdraw(100.0f);
}
});
threads[i].start();
}

for (int i = 0; i < NUM_OF_THREAD; i++) {
try {
// 等待 所有线程运行结束
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(String.format("Finally, %s's balance is: %f", acc.getName(), acc.getBalance()));
}
}

```

猜你喜欢

转载自www.cnblogs.com/francis11h/p/11775937.html