packagecom.nike.erick.d03;publicclassDemo03{privatestaticRoom room =newRoom();publicstaticvoidmain(String[] args)throwsInterruptedException{Thread firstThread =newThread(newRunnable(){@Overridepublicvoidrun(){for(int i =0; i <1000; i++){
room.decrement();}}});Thread secondThread =newThread(newRunnable(){@Overridepublicvoidrun(){for(int i =0; i <1000; i++){
room.increment();}}});
firstThread.start();
secondThread.start();
firstThread.join();
secondThread.join();System.out.println("result:"+ room.getValue());}}classRoom{privateint counter;// 锁对象是当前对象publicvoidincrement(){synchronized(this){
counter++;}}publicvoiddecrement(){synchronized(this){
counter--;}}publicintgetValue(){synchronized(this){return counter;}}}
2. 同步方法
2.1 成员方法
同步成员方法和同步代码块效果一样,必须保证同步代码块的锁对象是this对象
可能锁粒度不太一样
同步方法的锁对象是this,即当前对象
@DataclassCalculator{privateint number;publicvoidincr(){synchronized(this){for(int i =0; i <10000; i++){
number++;}}}// 同步方法publicsynchronizedvoiddecr(){for(int i =0; i <10000; i++){
number--;}}}
2.2 静态成员方法
锁对象:锁用的是类的字节码对象: Calculator.class
@DataclassCalculator{privatestaticint number;publicintgetNumber(){return number;}publicstaticvoidincr(){for(int i =0; i <10000; i++){synchronized(Calculator.class){
number++;}}}publicstaticsynchronizedvoiddecr(){for(int i =0; i <10000; i++){
number--;}}}
// 安全packagecom.nike.erick.d01;importjava.util.ArrayList;importjava.util.List;publicclassDemo05{publicstaticvoidmain(String[] args){ArrayList<String> list =newArrayList<>();SafeCounter safeCounter =newSafeCounter();
safeCounter.operation(list);System.out.println(list);}}classSafeCounter{publicvoidoperation(List<String> list){for(int i =0; i <10000; i++){addElement(list);deleteElement(list);}}publicvoidaddElement(List<String> list){
list.add("HELLO");}publicvoiddeleteElement(List<String> list){
list.remove(0);// 移除元素}}
packagecom.nike.erick.d01;importjava.util.ArrayList;importjava.util.List;publicclassDemo05{publicstaticvoidmain(String[] args){ArrayList<String> list =newArrayList<>();UnsafeCounter unsafeCounter =newUnsafeCounter();
unsafeCounter.operation(list);System.out.println(list);}}classSafeCounter{publicvoidoperation(List<String> list){for(int i =0; i <10000; i++){addElement(list);deleteElement(list);}}publicvoidaddElement(List<String> list){
list.add("HELLO");}publicvoiddeleteElement(List<String> list){
list.remove(0);// 移除元素}}classUnsafeCounterextendsSafeCounter{@OverridepublicvoiddeleteElement(List<String> list){/*开启了新的线程来改变*/// index out of bound// 相当于把删除的操作延迟或提前了newThread(()-> list.remove(0)).start();}}