????????????????????????(1)???????????????????????????????????е?????????????????????????????????????????Java???????е????????????synchronized.
????synchronized??Java?е???????????????????????ε??????????????
????1. ???????????飬?????ε?????????????飬????????Χ???????{}????????????????????????????????????
????2. ??????????????????ε????????????????????????Χ?????????????????????????????????????
????3. ????????????????????????Χ??????????????????????????????????ж???
????4. ????????????????Χ??synchronized??????????????????????????????????????????ж???
????????????????
?????????????????????е?synchronized(this)????????????????????????????????????????????????????????
??????Demo1????synchronized???÷?
/**
* ??????
*/
class SyncThread implements Runnable {
private static int count;
public SyncThread() {
count = 0;
}
public  void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
try {
System.out.println(Thread.currentThread().getName() + ":" + (count++));
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public int getCount() {
return count;
}
}
????SyncThread??????
????SyncThread syncThread = new SyncThread();
????Thread thread1 = new Thread(syncThread?? "SyncThread1");
????Thread thread2 = new Thread(syncThread?? "SyncThread2");
????thread1.start();
????thread2.start();
??????????£?
????SyncThread1:0
????SyncThread1:1
????SyncThread1:2
????SyncThread1:3
????SyncThread1:4
????SyncThread2:5
????SyncThread2:6
????SyncThread2:7
????SyncThread2:8
????SyncThread2:9*
?????????????????(thread1??thread2)????????????(syncThread)?е?synchronized??????????????????????????????У??????????????????????????????????????????????????и????顣Thread1??thread2???????????????synchronized????????????????????????????????????????????????????????????в??????????
???????????SyncThread????????????£?
????Thread thread1 = new Thread(new SyncThread()?? "SyncThread1");
????Thread thread2 = new Thread(new SyncThread()?? "SyncThread2");
????thread1.start();
????thread2.start();
??????????£?
????SyncThread1:0
????SyncThread2:1
????SyncThread1:2
????SyncThread2:3
????SyncThread1:4
????SyncThread2:5
????SyncThread2:6
????SyncThread1:7
????SyncThread1:8
????SyncThread2:9
??????????????????synchronized?????????????????????????????????????thread1??thread2??????С????????synchronized??????????????????????????lock????????????????????????????????δ???
????SyncThread syncThread1 = new SyncThread();
????SyncThread syncThread2 = new SyncThread();
????Thread thread1 = new Thread(syncThread1?? "SyncThread1");
????Thread thread2 = new Thread(syncThread2?? "SyncThread2");
????thread1.start();
????thread2.start();
?????????????????SyncThread?????syncThread1??syncThread2?????thread1??е???syncThread1?????е?synchronized????(run)???????thread2??е???syncThread2?????е?synchronized????(run)?????????synchronized???????????????????????????????syncThread1?????syncThread2????????????????????????????γ??????????????????????С?
????2.??????????????????synchronized(this)??????????????????????????????????е??synchronized(this)???????顣
??????Demo2?????????????synchronized???synchronized?????
class Counter implements Runnable{
private int count;
public Counter() {
count = 0;
}
public void countAdd() {
synchronized(this) {
for (int i = 0; i < 5; i ++) {
try {
System.out.println(Thread.currentThread().getName() + ":" + (count++));
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//??synchronized????飬δ??count???ж?д????????????????synchronized
public void printCount() {
for (int i = 0; i < 5; i ++) {
try {
System.out.println(Thread.currentThread().getName() + " count:" + count);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void run() {
String threadName = Thread.currentThread().getName();
if (threadName.equals("A")) {
countAdd();
} else if (threadName.equals("B")) {
printCount();
}
}
}
???????????:
????Counter counter = new Counter();
????Thread thread1 = new Thread(counter?? "A");
????Thread thread2 = new Thread(counter?? "B");
????thread1.start();
????thread2.start();
??????????£?
????A:0
????B count:1
????A:1
????B count:2
????A:2
????B count:3
????A:3
????B count:4
????A:4
????B count:5
?????????????countAdd?????synchronized???printCount???synchronized?????????????п???????????????????????synchronized??????????????????????????synchronized????????????????
????????????????????
??????Demo3??:????????????????
/**
* ?????????
*/
class Account {
String name;
float amount;
public Account(String name?? float amount) {
this.name = name;
this.amount = amount;
}
//???
public  void deposit(float amt) {
amount += amt;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//??
public  void withdraw(float amt) {
amount -= amt;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public float getBalance() {
return amount;
}
}
/**
* ?????????
*/
class AccountOperator implements Runnable{
private Account account;
public AccountOperator(Account account) {
this.account = account;
}
public void run() {
synchronized (account) {
account.deposit(500);
account.withdraw(500);
System.out.println(Thread.currentThread().getName() + ":" + account.getBalance());
}
}
}