???????????:
????Account account = new Account("zhang san"?? 10000.0f);
????AccountOperator accountOperator = new AccountOperator(account);
????final int THREAD_NUM = 5;
????Thread threads[] = new Thread[THREAD_NUM];
????for (int i = 0; i < THREAD_NUM; i ++) {
????threads[i] = new Thread(accountOperator?? "Thread" + i);
????threads[i].start();
????}
??????????£?
????Thread3:10000.0
????Thread2:10000.0
????Thread1:10000.0
????Thread4:10000.0
????Thread0:10000.0
??????AccountOperator ???е?run????????????synchronized ??account???????????????????????????account??????????????????account????????????????????????????account??????????????????????????????????????????δ???
?????????????????????????????????????????????????д????
????public void method3(SomeObject obj)
????{
????//obj ?????????
????synchronized(obj)
????{
????// todo
????}
????}
?????????????????????????????????δ???????????????????????????????????
????class Test implements Runnable
????{
????private byte[] lock = new byte[0];  // ?????instance????
????public void method()
????{
????synchronized(lock) {
????// todo ????????
????}
????}
????public void run() {
????}
????}
??????????????byte??????????????????κζ??????èD?D??????????????????????byte[]???????3??????????Object lock = new Object()?????7?в?????
???????????????
????Synchronized?????????????????????????????synchronized??public synchronized void method(){//todo}; synchronized???η????????????????????????????÷?Χ??????????δ????????????????????Χ???????η?????Χ?????????????罫??Demo1???е?run??????????μ?????????Ч???????
????*??Demo4????synchronized???????????
????public synchronized void run() {
????for (int i = 0; i < 5; i ++) {
????try {
????System.out.println(Thread.currentThread().getName() + ":" + (count++));
????Thread.sleep(100);
????} catch (InterruptedException e) {
????e.printStackTrace();
????}
????}
????}
????Synchronized????????????????д????
????д?????
????public synchronized void method()
????{
????// todo
????}
????д??????
????public void method()
????{
????synchronized(this) {
????// todo
????}
????}
????д??????ε????????????д???????ε??????????飬??д?????д????????????????????????????????????
????????synchronized???η???????????????
????1. synchronized?????????С?
??????????????synchronized?????巽??????synchronized??????????????????????????synchronized???????????С??????????е?????????????synchronized???????????????и?????????????????????е???????????????2?????????????????????????????????????м???synchronized??????????????????????????????е??????????????????????????????е?????????????????????????????????????????????????????????????????????????????????£?
?????????????м???synchronized?????
????class Parent {
????public synchronized void method() { }
????}
????class Child extends Parent {
????public synchronized void method() { }
????}
?????????????е??????????????
????class Parent {
????public synchronized void method() {   }
????}
????class Child extends Parent {
????public void method() { super.method();   }
????}
??????????????????????synchronized??????
?????????????????synchronized???????????????synchronized????????????????
???????????????????
????Synchronized????????????????????÷????£?
????public synchronized static void method() {
????// todo
????}
?????????????????????????????????????????????synchronized???ε????????????????????????ж????????Demo1?????Щ??????£?
??????Demo5????synchronized???ξ??????
/**
* ??????
*/
class SyncThread implements Runnable {
private static int count;
public SyncThread() {
count = 0;
}
public synchronized static void method() {
for (int i = 0; i < 5; i ++) {
try {
System.out.println(Thread.currentThread().getName() + ":" + (count++));
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void run() {
method();
}
}
???????????:
????SyncThread syncThread1 = new SyncThread();
????SyncThread syncThread2 = new SyncThread();
????Thread thread1 = new Thread(syncThread1?? "SyncThread1");
????Thread thread2 = new Thread(syncThread2?? "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
????syncThread1??syncThread2??SyncThread??????????????thread1??thread2??????????????????????????????run?е???????????method?????????????????????????syncThread1??syncThread2????????????????????Demo1???????
?????????????
????Synchronized????????????????÷????£?
????class ClassName {
????public void method() {
????synchronized(ClassName.class) {
????// todo
????}
????}
????}
?????????Demo5?????Щ????
??????Demo6??:?????????
/**
* ??????
*/
class SyncThread implements Runnable {
private static int count;
public SyncThread() {
count = 0;
}
public static void method() {
synchronized(SyncThread.class) {
for (int i = 0; i < 5; i ++) {
try {
System.out.println(Thread.currentThread().getName() + ":" + (count++));
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public synchronized void run() {
method();
}
}
??????Ч?????Demo5??????????synchronized???????????T???????????T??????T?????ж????????????????
???????
????A. ????synchronized?????????????????????????????????????????????????????????????synchronized?????????????????????????????????????????????????е????????????
????B. ?????????????????lock?????????????????????????????????????????δ???
????C. ??????????????????????????????????????????????????????????ν??????????