├── .gitignore
├── README.md
├── blogs
├── README.md
├── javase
│ ├── java基础巩固笔记(1)-反射.md
│ ├── java基础巩固笔记(2)-泛型.md
│ ├── java基础巩固笔记(3)-类加载器.md
│ ├── java基础巩固笔记(4)-代理.md
│ ├── java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md
│ ├── java基础巩固笔记(5)-多线程之传统多线程.md
│ ├── java基础巩固笔记(5)-多线程之共享数据.md
│ ├── java基础巩固笔记(5)-多线程之线程并发库.md
│ └── java基础巩固笔记(6)-注解.md
└── javaweb
│ ├── javaweb入门笔记(1)-Tomcat.md
│ ├── javaweb入门笔记(2)-http入门.md
│ ├── javaweb入门笔记(3)-Servlet.md
│ ├── javaweb入门笔记(4)-request和response.md
│ ├── javaweb入门笔记(5)-cookie和session.md
│ └── javaweb入门笔记(6)-JSP技术.md
├── java-base
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── brianway
│ └── learning
│ └── java
│ └── base
│ ├── Binary.java
│ ├── HelloWorld.java
│ ├── constructor
│ ├── datatype
│ ├── Boxing.java
│ ├── IntegerChanger.java
│ └── NumberEquation.java
│ ├── generics
│ ├── ArrayMaker.java
│ ├── BasicBounds.java
│ ├── ClassTypeCapture.java
│ ├── CovariantArrays.java
│ ├── CreatorGeneric.java
│ ├── ErasedTypeEquivalence.java
│ ├── FactoryConstraint.java
│ ├── GenericArray.java
│ ├── GenericArray2.java
│ ├── GenericArrayWithTypeToken.java
│ ├── GenericMethods.java
│ ├── GenericReading.java
│ ├── GenericVarargs.java
│ ├── GenericWriting.java
│ ├── GenericsAndCovariance.java
│ ├── Holder.java
│ ├── InheritBounds.java
│ ├── InstantiateGenericType.java
│ ├── LinkedStack.java
│ ├── LostInformation.java
│ ├── SuperTypeWildcards.java
│ └── Wildcards.java
│ ├── innerclass
│ ├── ClassCreator.java
│ └── EnclosingOne.java
│ └── typeinfo
│ ├── BoundedClassReferences.java
│ ├── ClassCasts.java
│ ├── ClassInitialization.java
│ ├── FamilyVsExactType.java
│ ├── FilledList.java
│ ├── GenericClassReferences.java
│ ├── SimpleDynamicProxy.java
│ ├── SimpleProxyDemo.java
│ └── WildcardClassReferences.java
├── java-container
└── pom.xml
├── java-io
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── brianway
│ │ └── learning
│ │ └── java
│ │ ├── io
│ │ ├── BufferedInputFile.java
│ │ ├── DirList.java
│ │ ├── Echo.java
│ │ ├── FileOutput.java
│ │ ├── MakeDirectories.java
│ │ ├── MemoryInput.java
│ │ └── TextFile.java
│ │ └── nio
│ │ ├── BufferToText.java
│ │ ├── ChannelCopy.java
│ │ ├── Endians.java
│ │ ├── GetChannel.java
│ │ └── ViewBuffers.java
│ └── resources
│ └── infile.txt
├── java-jvm
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── brianway
│ └── learning
│ └── java
│ └── jvm
│ ├── classloading
│ ├── ClassLoaderTest.java
│ ├── ClinitOrder.java
│ ├── ConstClass.java
│ ├── DeadLoopClass.java
│ ├── FieldResolution.java
│ ├── NoInitialization.java
│ ├── SimpleClass.java
│ ├── SubClass.java
│ └── SuperClass.java
│ ├── dynamictype
│ ├── GrandFatherCaller.java
│ ├── InvokeDynamicTest.java
│ └── MethodHandleTest.java
│ ├── gc
│ ├── FinalizeEscapeGC.java
│ └── ReferenceCountingGC.java
│ ├── memory
│ ├── DirectMemoryOOM.java
│ ├── HeapOOM.java
│ ├── JavaVMStackOOM.java
│ ├── JavaVMStackSOF.java
│ └── RuntimeConstantPoolOOM.java
│ └── methodinvoke
│ ├── Dispatch.java
│ ├── DynamicDispatch.java
│ ├── StaticDispatch.java
│ └── StaticResolution.java
├── java-multithread
├── README.md
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── brianway
│ └── learning
│ └── java
│ ├── concurrent
│ ├── CachedThreadPool.java
│ ├── CallableDemo.java
│ ├── CaptureUncaughtException.java
│ ├── CloseResource.java
│ ├── CountDownLatchDemo.java
│ ├── DaemonFromFactory.java
│ ├── DaemonThreadFactory.java
│ ├── DaemonsDontRunFinally.java
│ ├── FixedThreadPool.java
│ ├── Interrupting.java
│ ├── InterruptingIdiom.java
│ ├── Joining.java
│ ├── LiftOff.java
│ ├── MoreBasicThreads.java
│ ├── OrnamentalGarden.java
│ ├── PipedIO.java
│ ├── SimpleDaemons.java
│ ├── SingleThreadExecutor.java
│ ├── SleepingTask.java
│ ├── TestBlockingQueues.java
│ └── ToastOMatic.java
│ └── multithread
│ ├── communication
│ ├── example1
│ │ ├── MyList.java
│ │ ├── Run1_TwoThreadTransData.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example10
│ │ ├── C_Thread.java
│ │ ├── Consumer.java
│ │ ├── MyStack.java
│ │ ├── P_Thread.java
│ │ ├── Producer.java
│ │ └── Run10_oneP_manyC.java
│ ├── example11
│ │ ├── C_Thread.java
│ │ ├── Consumer.java
│ │ ├── MyStack.java
│ │ ├── P_Thread.java
│ │ ├── Producer.java
│ │ ├── Run11_manyP_manyC.java
│ │ ├── Run11_manyP_oneC.java
│ │ └── Run11_oneP_manyC.java
│ ├── example12
│ │ ├── ReadData.java
│ │ ├── Run12_pipeInputOutput.java
│ │ ├── ThreadRead.java
│ │ ├── ThreadWrite.java
│ │ └── WriteData.java
│ ├── example13
│ │ ├── BackupA.java
│ │ ├── BackupB.java
│ │ ├── DBTools.java
│ │ └── Run13_wait_notify_insert.java
│ ├── example14
│ │ ├── Run14_join.java
│ │ ├── Run14_joinExption.java
│ │ ├── Run14_joinLong.java
│ │ ├── ThreadA.java
│ │ ├── ThreadB.java
│ │ └── ThreadC.java
│ ├── example15
│ │ ├── Run15_joinMore.java
│ │ ├── Run15_join_sleep.java
│ │ ├── Run15_join_sleep_2.java
│ │ ├── ThreadA.java
│ │ ├── ThreadB.java
│ │ └── ThreadC.java
│ ├── example16
│ │ ├── InheritableThreadLocalExt.java
│ │ ├── InheritableThreadLocalExt2.java
│ │ ├── Run16_InheritableThreadLocalExt.java
│ │ ├── Run16_InheritableThreadLocalExt2.java
│ │ ├── Run16_ThreadLocal.java
│ │ ├── ThreadA.java
│ │ ├── ThreadB.java
│ │ ├── ThreadC.java
│ │ ├── ThreadLocalExt.java
│ │ └── Tools.java
│ ├── example2
│ │ ├── Run2_noObjectLock.java
│ │ ├── Run2_notify.java
│ │ ├── Run2_sleep.java
│ │ ├── Run2_wait.java
│ │ ├── Thread1.java
│ │ └── Thread2.java
│ ├── example3
│ │ ├── MyThread.java
│ │ ├── NotifyThread.java
│ │ ├── NotifyThread2.java
│ │ ├── NotifyThread3.java
│ │ ├── Run3_notifyAll.java
│ │ ├── Run3_notifyMany.java
│ │ ├── Run3_notifyOne.java
│ │ └── Service.java
│ ├── example4
│ │ ├── Run4_waitHasParam.java
│ │ └── Run4_waitHasParam2.java
│ ├── example5
│ │ ├── MyRun.java
│ │ ├── Run5_notify.java
│ │ └── Run5_notifyEarly.java
│ ├── example6
│ │ ├── Add.java
│ │ ├── Run6_waitOld.java
│ │ ├── Subtract.java
│ │ ├── ThreadAdd.java
│ │ ├── ThreadSubtract.java
│ │ └── ValueObject.java
│ ├── example7
│ │ ├── Consumer.java
│ │ ├── Run7_ProducerAndConsumer_One.java
│ │ ├── ThreadC.java
│ │ ├── ThreadP.java
│ │ ├── ValueObject.java
│ │ └── producer.java
│ ├── example8
│ │ ├── Consumer.java
│ │ ├── Producer.java
│ │ ├── Run8_allWait.java
│ │ ├── ThreadC.java
│ │ ├── ThreadP.java
│ │ └── ValueObject.java
│ └── example9
│ │ ├── C_Thread.java
│ │ ├── Consumer.java
│ │ ├── MyStack.java
│ │ ├── P_Thread.java
│ │ ├── Producer.java
│ │ ├── Run9_oneP_manyC.java
│ │ └── Run9_oneP_oneC.java
│ ├── lock
│ ├── example1
│ │ ├── Run1_UseConditionWaitNotify.java
│ │ ├── Run1_UseConditionWaitNotifyError.java
│ │ ├── Run1_UseConditionWaitNotifyOk.java
│ │ ├── ServiceA.java
│ │ ├── ServiceB.java
│ │ ├── ServiceC.java
│ │ ├── ThreadA.java
│ │ ├── ThreadB.java
│ │ └── ThreadC.java
│ ├── example10
│ │ ├── Run10_ReadWriteLockBegin1.java
│ │ ├── Run10_ReadWriteLockBegin2.java
│ │ ├── Run10_ReadWriteLockBegin3.java
│ │ ├── Run10_condition.java
│ │ ├── Service1.java
│ │ ├── Service2.java
│ │ └── Service3.java
│ ├── example2
│ │ ├── MyService.java
│ │ ├── Run2_MustUseMoreCondition.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example3
│ │ ├── MyService.java
│ │ ├── Run3_ConditionManyToMany.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example4
│ │ ├── Run4_Fair.java
│ │ ├── Run4_notFair.java
│ │ └── Service.java
│ ├── example5
│ │ ├── Run5_getHoldCount.java
│ │ ├── Run5_getQueueLength.java
│ │ ├── Run5_getWaitQueueLength.java
│ │ ├── Service1.java
│ │ ├── Service2.java
│ │ └── Service3.java
│ ├── example6
│ │ ├── Run6_hasQueueThread.java
│ │ ├── Run6_hasWaiters.java
│ │ ├── Service1.java
│ │ └── Service2.java
│ ├── example7
│ │ ├── Run7_isFair.java
│ │ ├── Run7_isHeldByCurrentThread.java
│ │ ├── Run7_isLocked.java
│ │ ├── Service1.java
│ │ ├── Service2.java
│ │ └── Service3.java
│ ├── example8
│ │ ├── Run8_lockInterruptibly1.java
│ │ ├── Run8_lockInterruptibly2.java
│ │ ├── Run8_tryLock.java
│ │ ├── Run8_tryLock_param.java
│ │ ├── Service1.java
│ │ ├── Service2.java
│ │ ├── Service3.java
│ │ └── Service4.java
│ └── example9
│ │ ├── Run9_awaitUniterruptibly1.java
│ │ ├── Run9_awaitUniterruptibly2.java
│ │ ├── Run9_awaitUntil1.java
│ │ ├── Run9_awaitUntil2.java
│ │ ├── Service.java
│ │ ├── Service1.java
│ │ ├── Service2.java
│ │ ├── Thread1.java
│ │ ├── Thread2.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── meet
│ ├── Run.java
│ ├── Run10_isInterrupted.java
│ ├── Run11_sleepAndinterrupt01.java
│ ├── Run12_sleepAndinterrupt02.java
│ ├── Run13_suspendAndresume01.java
│ ├── Run14_suspendAndresume02.java
│ ├── Run15_suspendAndresume03.java
│ ├── Run16_yield.java
│ ├── Run17_priority01.java
│ ├── Run18_priority02.java
│ ├── Run2_StartVsRun.java
│ ├── Run3_getName.java
│ ├── Run4_isAlive01.java
│ ├── Run5_isAlive02.java
│ ├── Run6_StartVsRun02.java
│ ├── Run7_interrupt01.java
│ ├── Run8_interrupted01.java
│ ├── Run9_interrupted02.java
│ └── printMain.java
│ ├── singleton
│ ├── example1
│ │ ├── MyObject0.java
│ │ ├── MyObject1.java
│ │ ├── MyObject2.java
│ │ ├── Run1_singleton0.java
│ │ ├── Run1_singleton1.java
│ │ ├── Run1_singleton2.java
│ │ ├── Thread0.java
│ │ ├── Thread1.java
│ │ └── Thread2.java
│ ├── example2
│ │ ├── MyObject1.java
│ │ ├── MyObject2.java
│ │ ├── MyObject3.java
│ │ ├── MyObject4.java
│ │ ├── Run2_singleton1.java
│ │ ├── Run2_singleton2.java
│ │ ├── Run2_singleton3.java
│ │ ├── Run2_singleton4.java
│ │ ├── Thread1.java
│ │ ├── Thread2.java
│ │ ├── Thread3.java
│ │ └── Thread4.java
│ └── example3
│ │ ├── MyObject1.java
│ │ ├── MyObject2.java
│ │ ├── MyObject3.java
│ │ ├── MyObject4.java
│ │ ├── MyObject5.java
│ │ ├── Run3_singleton1.java
│ │ ├── Run3_singleton2.java
│ │ ├── Run3_singleton3.java
│ │ ├── Run3_singleton4.java
│ │ ├── Run3_singleton5.java
│ │ ├── Thread1.java
│ │ ├── Thread3.java
│ │ ├── Thread4.java
│ │ └── Thread5.java
│ ├── supplement
│ ├── example1
│ │ ├── MyService.java
│ │ ├── Run1_state1.java
│ │ ├── Run1_state2.java
│ │ ├── Run1_state3.java
│ │ ├── Thread1.java
│ │ ├── Thread2.java
│ │ └── Thread3.java
│ ├── example2
│ │ ├── MyThread.java
│ │ ├── Run2_autoAddGroup.java
│ │ ├── Run2_getGroupParent.java
│ │ ├── Run2_groupAddThread.java
│ │ ├── Run2_groupAddThreadMoreLevel.java
│ │ ├── Run2_threadRunSyn.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example3
│ │ ├── DateTools1.java
│ │ ├── DateTools2.java
│ │ ├── Run3_formatError.java
│ │ ├── Run3_formatOK1.java
│ │ ├── Run3_formatOK2.java
│ │ ├── Thread0.java
│ │ ├── Thread1.java
│ │ └── Thread2.java
│ ├── example4
│ │ ├── Run4_threadCreateException.java
│ │ ├── Run4_threadCreateException2.java
│ │ ├── Run4_threadCreateException3.java
│ │ └── Thread1.java
│ ├── example5
│ │ ├── Run5_threadGroup1.java
│ │ ├── Run5_threadGroup2.java
│ │ ├── Thread1.java
│ │ ├── Thread2.java
│ │ └── ThreadGroup2.java
│ └── example6
│ │ ├── MyThread.java
│ │ ├── MyThreadGroup.java
│ │ ├── ObjectUncaughtExceptionHandler.java
│ │ ├── Run6_threadExceptionMove1.java
│ │ ├── Run6_threadExceptionMove2.java
│ │ └── StateUncaughtExceptionHandler.java
│ ├── synchronize
│ ├── example1
│ │ ├── HasLocalNum.java
│ │ ├── Run1_local.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example10
│ │ ├── Run10_synBlockMoreObjectOneLock.java
│ │ ├── Run10_synMoreObjectStaticOneLock.java
│ │ ├── Run10_synTwoLock.java
│ │ ├── Service.java
│ │ ├── ServiceSub.java
│ │ ├── ServiceSub2.java
│ │ ├── ThreadA.java
│ │ ├── ThreadB.java
│ │ └── ThreadC.java
│ ├── example11
│ │ ├── Run11_StringAndSyn.java
│ │ ├── Run11_StringAndSyn2.java
│ │ ├── ServiceA.java
│ │ ├── ServiceB.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example12
│ │ ├── DealThread.java
│ │ └── Run12_deadLock.java
│ ├── example13
│ │ ├── OutClass.java
│ │ ├── OutClass2.java
│ │ ├── Run13_inner01.java
│ │ └── Run13_inner02.java
│ ├── example14
│ │ ├── Run14_setNewStringTwoLock.java
│ │ └── Service.java
│ ├── example15
│ │ ├── Run15_synchronized.java
│ │ ├── Run15_volatile.java
│ │ ├── RunThread.java
│ │ └── RunThread2.java
│ ├── example16
│ │ ├── MyThread.java
│ │ └── Run16_volatile.java
│ ├── example2
│ │ ├── HasSelfPrivateNum.java
│ │ ├── Run2_private01.java
│ │ ├── Run2_twoObject.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example3
│ │ ├── MyObject.java
│ │ ├── Run3_synchronized01.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example4
│ │ ├── MyObject.java
│ │ ├── Run4_synchronized01.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example5
│ │ ├── Main.java
│ │ ├── Run5_lockRein.java
│ │ └── Sub.java
│ ├── example6
│ │ ├── Run6_exception.java
│ │ ├── Service.java
│ │ ├── ThreadA.java
│ │ └── ThreadB.java
│ ├── example7
│ │ ├── Main.java
│ │ ├── MyThread.java
│ │ ├── Run7_synNotExtends.java
│ │ └── Sub.java
│ ├── example8
│ │ ├── CommonUtils.java
│ │ ├── MyThreadA.java
│ │ ├── MyThreadB.java
│ │ ├── Run8_synchronized01.java
│ │ ├── Run8_synchronized02.java
│ │ ├── TaskA.java
│ │ └── TaskB.java
│ └── example9
│ │ ├── MyObject.java
│ │ ├── MyObject1.java
│ │ ├── MyObject2.java
│ │ ├── MyThread.java
│ │ ├── Run9_synchronized01.java
│ │ ├── Run9_synchronized01_twoObjects.java
│ │ ├── Run9_synchronized02.java
│ │ ├── Run9_synchronized03.java
│ │ ├── Service.java
│ │ ├── Thread1.java
│ │ └── Thread2.java
│ └── timer
│ ├── example1
│ ├── MyTask.java
│ ├── Run1_timer1.java
│ ├── Run1_timer2.java
│ ├── Run1_timer3.java
│ ├── Run1_timer4.java
│ ├── Run1_timer5.java
│ ├── TaskA.java
│ └── TaskB.java
│ ├── example2
│ ├── MyTask.java
│ ├── Run2_period1.java
│ ├── Run2_period2.java
│ ├── Run2_period3.java
│ └── TaskA.java
│ ├── example3
│ ├── MyTask.java
│ ├── Run3_cancel1.java
│ ├── Run3_cancel2.java
│ ├── Run3_cancel3.java
│ ├── TaskA.java
│ ├── TaskA2.java
│ ├── TaskB.java
│ └── TaskB2.java
│ └── example4
│ ├── Run4_schedule1.java
│ ├── Run4_schedule2.java
│ ├── Run4_schedule3.java
│ ├── Run4_schedule4.java
│ ├── Run4_schedule5.java
│ ├── Run4_schedule6.java
│ ├── Run4_scheduleAtFixedRate1.java
│ ├── Run4_scheduleAtFixedRate2.java
│ ├── Run4_scheduleAtFixedRate3.java
│ ├── Run4_scheduleAtFixedRate4.java
│ ├── Run4_schedule_vs_scheduleAtFixedRate_1.java
│ └── Run4_schedule_vs_scheduleAtFixedRate_2.java
├── java8
├── README.md
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── brianway
│ │ │ └── learning
│ │ │ └── java8
│ │ │ ├── effective
│ │ │ ├── Ambiguous.java
│ │ │ ├── async
│ │ │ │ ├── AsyncShop.java
│ │ │ │ ├── AsyncShopClient.java
│ │ │ │ ├── BestPriceFinder.java
│ │ │ │ ├── BestPriceFinderMain.java
│ │ │ │ ├── Discount.java
│ │ │ │ ├── ExchangeService.java
│ │ │ │ ├── Quote.java
│ │ │ │ ├── Shop.java
│ │ │ │ ├── Util.java
│ │ │ │ └── v1
│ │ │ │ │ ├── BestPriceFinder.java
│ │ │ │ │ ├── BestPriceFinderMain.java
│ │ │ │ │ ├── Shop.java
│ │ │ │ │ └── ShopMain.java
│ │ │ ├── optional
│ │ │ │ ├── Car.java
│ │ │ │ ├── Insurance.java
│ │ │ │ ├── OptionalInAction.java
│ │ │ │ ├── OptionalMain.java
│ │ │ │ ├── Person.java
│ │ │ │ └── ReadPositiveIntParam.java
│ │ │ ├── tech
│ │ │ │ ├── ChainOfResponsibilityMain.java
│ │ │ │ ├── Debugging.java
│ │ │ │ ├── FactoryMain.java
│ │ │ │ ├── ObserverMain.java
│ │ │ │ ├── Peek.java
│ │ │ │ ├── StrategyMain.java
│ │ │ │ └── TemplateMain.java
│ │ │ └── time
│ │ │ │ └── DateTimeExamples.java
│ │ │ ├── lambda
│ │ │ ├── ConstructorReference.java
│ │ │ ├── ExecuteAround.java
│ │ │ ├── FilteringApples.java
│ │ │ └── FunctionDescriptor.java
│ │ │ └── streamapi
│ │ │ ├── BuildingStreams.java
│ │ │ ├── Dish.java
│ │ │ ├── Laziness.java
│ │ │ ├── StreamBasic.java
│ │ │ ├── StreamOperation.java
│ │ │ ├── collect
│ │ │ ├── CollectorHarness.java
│ │ │ ├── Grouping.java
│ │ │ ├── GroupingTransactions.java
│ │ │ ├── PartitionPrimeNumbers.java
│ │ │ ├── Partitioning.java
│ │ │ ├── Reducing.java
│ │ │ ├── Summarizing.java
│ │ │ └── ToListCollector.java
│ │ │ ├── parallel
│ │ │ ├── ForkJoinSumCalculator.java
│ │ │ ├── ParallelStreams.java
│ │ │ ├── ParallelStreamsHarness.java
│ │ │ └── WordCount.java
│ │ │ ├── practice
│ │ │ ├── PuttingIntoPractice.java
│ │ │ ├── Trader.java
│ │ │ └── Transaction.java
│ │ │ └── usage
│ │ │ ├── Filtering.java
│ │ │ ├── Finding.java
│ │ │ ├── Mapping.java
│ │ │ ├── NumericStreams.java
│ │ │ └── Reducing.java
│ └── resources
│ │ ├── data-building.txt
│ │ └── data-lambda.txt
│ └── test
│ └── java
│ └── com
│ └── brianway
│ └── learning
│ └── java8
│ └── effective
│ └── optional
│ └── ReadPositiveIntParamTest.java
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | # Eclipse
2 | .classpath
3 | .project
4 | .settings/
5 |
6 | # Intellij
7 | .idea/
8 | *.iml
9 | *.iws
10 |
11 | # Mac
12 | .DS_Store
13 |
14 | # Maven
15 | log/
16 | target/
17 | out/
18 |
19 | # Others
20 | bin/
21 | .myeclipse
22 | .hprof
--------------------------------------------------------------------------------
/java-base/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | java-learning
7 | com.brianway.learning.java
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | java-base
13 |
14 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/HelloWorld.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class HelloWorld {
7 | public static void main(String[] args) {
8 | System.out.println("Hello World");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/constructor/FatherClass.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.constructor;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class FatherClass {
7 | protected static int count = 10;
8 | private String name;
9 |
10 | static {
11 | System.out.println("父类的静态属性count初始化:" + count);
12 | }
13 |
14 | public FatherClass() {
15 | System.out.println("执行了父类的无参构造方法");
16 | }
17 |
18 | public FatherClass(String name) {
19 | this.name = name;
20 | System.out.println("执行了父类的构造方法FatherClass(String name) " + name);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/datatype/NumberEquation.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.datatype;
2 |
3 | /**
4 | * Created by brian on 16/11/10.
5 | *
6 | * 包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱;
7 | * 包装类的equals()方法不处理数据转型.
8 | */
9 | public class NumberEquation {
10 | public static void main(String[] args) {
11 | Integer i = 42;
12 | Long l = 42l;
13 | Double d = 42.0;
14 |
15 | System.out.println(i.equals(d)); // false
16 | System.out.println(d.equals(l)); // false
17 | System.out.println(i.equals(l)); // false
18 | System.out.println(l.equals(42L)); // true
19 | }
20 | }
21 |
22 | // (i == l),(i == d),(l == d)会出现编译错误
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/ArrayMaker.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;
2 |
3 | import java.lang.reflect.Array;
4 | import java.util.Arrays;
5 |
6 | /**
7 | * 对于泛型中创建数组,使用Array.newInstance()是推荐的方式
8 | */
9 | public class ArrayMaker {
10 | private Class kind;
11 |
12 | public ArrayMaker(Class kind) {
13 | this.kind = kind;
14 | }
15 |
16 | @SuppressWarnings("unchecked")
17 | T[] create(int size) {
18 | return (T[]) Array.newInstance(kind, size);
19 | }
20 |
21 | public static void main(String[] args) {
22 | ArrayMaker stringMaker =
23 | new ArrayMaker(String.class);
24 | String[] stringArray = stringMaker.create(9);
25 | System.out.println(Arrays.toString(stringArray));
26 | }
27 | }
28 | /* Output:
29 | [null, null, null, null, null, null, null, null, null]
30 | *///:~
31 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/CreatorGeneric.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;
2 |
3 | /**
4 | * 末班方法设计模式
5 | */
6 | public class CreatorGeneric {
7 | public static void main(String[] args) {
8 | Creator c = new Creator();
9 | c.f();
10 | }
11 | }
12 |
13 | abstract class GenericWithCreate {
14 | final T element;
15 |
16 | GenericWithCreate() {
17 | element = create();
18 | }
19 |
20 | abstract T create();
21 | }
22 |
23 | class X {
24 | }
25 |
26 | class Creator extends GenericWithCreate {
27 | X create() {
28 | return new X();
29 | }
30 |
31 | void f() {
32 | System.out.println(element.getClass().getSimpleName());
33 | }
34 | }
35 |
36 | /* Output:
37 | X
38 | *///:~
39 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/ErasedTypeEquivalence.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;
2 |
3 | import java.util.ArrayList;
4 |
5 | public class ErasedTypeEquivalence {
6 | public static void main(String[] args) {
7 | Class c1 = new ArrayList().getClass();
8 | Class c2 = new ArrayList().getClass();
9 | Class c3 = ArrayList.class;
10 | System.out.println(c1 == c2);
11 | System.out.println(c1 == c3);
12 | }
13 | }
14 | /* Output:
15 | true
16 | true
17 | *///:~
18 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/FactoryConstraint.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;//: generics/FactoryConstraint.java
2 |
3 | /**
4 | * 显式工厂
5 | */
6 | public class FactoryConstraint {
7 | public static void main(String[] args) {
8 | new Foo2(new IntegerFactory());
9 | new Foo2(new Widget.Factory());
10 | }
11 | }
12 |
13 | interface FactoryI {
14 | T create();
15 | }
16 |
17 | class Foo2 {
18 | private T x;
19 |
20 | public > Foo2(F factory) {
21 | x = factory.create();
22 | }
23 |
24 | }
25 |
26 | class IntegerFactory implements FactoryI {
27 | public Integer create() {
28 | return 0;
29 | }
30 | }
31 |
32 | class Widget {
33 | public static class Factory implements FactoryI {
34 | public Widget create() {
35 | return new Widget();
36 | }
37 | }
38 | }
39 | ///:~
40 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericArray.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;//: generics/GenericArray.java
2 |
3 | /**
4 | * 泛型数组
5 | */
6 | public class GenericArray {
7 | private T[] array;
8 |
9 | @SuppressWarnings("unchecked")
10 | public GenericArray(int sz) {
11 | array = (T[]) new Object[sz];
12 | }
13 |
14 | public void put(int index, T item) {
15 | array[index] = item;
16 | }
17 |
18 | public T get(int index) {
19 | return array[index];
20 | }
21 |
22 | // Method that exposes the underlying representation:
23 | public T[] rep() {
24 | return array;
25 | }
26 |
27 | public static void main(String[] args) {
28 | GenericArray gai =
29 | new GenericArray(10);
30 | // This causes a ClassCastException:
31 | //! Integer[] ia = gai.rep();
32 | // This is OK:
33 | Object[] oa = gai.rep();
34 | }
35 | } ///:~
36 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericMethods.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;
2 |
3 | /**
4 | * 泛型方法
5 | */
6 | public class GenericMethods {
7 | public void f(T x) {
8 | System.out.println(x.getClass().getName());
9 | }
10 |
11 | public static void main(String[] args) {
12 | GenericMethods gm = new GenericMethods();
13 | gm.f("");
14 | gm.f(1);
15 | gm.f(1.0);
16 | gm.f(1.0F);
17 | gm.f('c');
18 | gm.f(gm);
19 | }
20 | }
21 | /* Output:
22 | java.lang.String
23 | java.lang.Integer
24 | java.lang.Double
25 | java.lang.Float
26 | java.lang.Character
27 | GenericMethods
28 | *///:~
29 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericVarargs.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | /**
7 | * 可变参数与泛型方法
8 | */
9 | public class GenericVarargs {
10 | public static List makeList(T... args) {
11 | List result = new ArrayList();
12 | for (T item : args)
13 | result.add(item);
14 | return result;
15 | }
16 |
17 | public static void main(String[] args) {
18 | List ls = makeList("A");
19 | System.out.println(ls);
20 | ls = makeList("A", "B", "C");
21 | System.out.println(ls);
22 | ls = makeList("ABCDEFFHIJKLMNOPQRSTUVWXYZ".split(""));
23 | System.out.println(ls);
24 | }
25 | }
26 | /* Output:
27 | [A]
28 | [A, B, C]
29 | [, A, B, C, D, E, F, F, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
30 | *///:~
31 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/GenericsAndCovariance.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | /**
7 | *
8 | */
9 | public class GenericsAndCovariance {
10 | public static void main(String[] args) {
11 | // Wildcards allow covariance:
12 | List extends Fruit> flist = new ArrayList();
13 | // Compile Error: can't add any type of object:
14 | // flist.add(new Apple());
15 | // flist.add(new Fruit());
16 | // flist.add(new Object());
17 | flist.add(null); // Legal but uninteresting
18 | // We know that it returns at least Fruit:
19 | Fruit f = flist.get(0);
20 | }
21 | } ///:~
22 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/generics/SuperTypeWildcards.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.generics;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | /**
7 | * 逆变
8 | * 超类型通配符
9 | */
10 | public class SuperTypeWildcards {
11 | static void writeTo(List super Apple> apples) {
12 | apples.add(new Apple());
13 | apples.add(new Jonathan());
14 | // apples.add(new Fruit()); // Error
15 | }
16 |
17 | public static void main(String[] args) {
18 | SuperTypeWildcards.writeTo(new ArrayList());
19 | }
20 | } ///:~
21 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/innerclass/ClassCreator.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.innerclass;
2 |
3 | /**
4 | * Created by brian on 16/11/10.
5 | *
6 | * 创建内部类的测试类
7 | */
8 | public class ClassCreator {
9 | public static void main(String[] args) {
10 | //在其他类里创建非静态内部类和静态内部类
11 | EnclosingOne eo = new EnclosingOne();
12 | EnclosingOne.InsideOne io = eo.new InsideOne();
13 | EnclosingOne.InsideTwo it = new EnclosingOne.InsideTwo();
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/innerclass/EnclosingOne.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.innerclass;
2 |
3 | /**
4 | * Created by brian on 16/11/10.
5 | */
6 | public class EnclosingOne {
7 |
8 | public class InsideOne {
9 |
10 | }
11 |
12 | static public class InsideTwo {
13 |
14 | }
15 |
16 | public static void main(String[] args) {
17 | EnclosingOne eo = new EnclosingOne();
18 | InsideOne io = eo.new InsideOne();
19 | InsideTwo it = new InsideTwo();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/BoundedClassReferences.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.typeinfo;
2 |
3 | public class BoundedClassReferences {
4 | public static void main(String[] args) {
5 | Class extends Number> bounded = int.class;
6 | bounded = double.class;
7 | bounded = Number.class;
8 | // Or anything else derived from Number.
9 | }
10 | } ///:~
11 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/GenericClassReferences.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.typeinfo;
2 |
3 | public class GenericClassReferences {
4 | public static void main(String[] args) {
5 |
6 | Class genericIntClass = int.class;
7 | genericIntClass = Integer.class; // Same thing
8 |
9 | Class intClass = int.class;
10 | intClass = double.class;
11 | // genericIntClass = double.class; // Illegal
12 |
13 | System.out.println(int.class == Integer.class);
14 | }
15 | } ///:~
16 |
--------------------------------------------------------------------------------
/java-base/src/main/java/com/brianway/learning/java/base/typeinfo/WildcardClassReferences.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.base.typeinfo;
2 |
3 | public class WildcardClassReferences {
4 | public static void main(String[] args) {
5 | Class> intClass = int.class;
6 | intClass = double.class;
7 | }
8 | } ///:~
9 |
--------------------------------------------------------------------------------
/java-container/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | java-learning
7 | com.brianway.learning.java
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | java-container
13 |
14 |
--------------------------------------------------------------------------------
/java-io/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | java-learning
7 | com.brianway.learning.java
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | java-io
13 |
14 |
--------------------------------------------------------------------------------
/java-io/src/main/java/com/brianway/learning/java/io/BufferedInputFile.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.io;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.FileReader;
5 | import java.io.IOException;
6 |
7 | /**
8 | * Created by brian on 16/11/28.
9 | */
10 | public class BufferedInputFile {
11 | public static String read(String filename) throws IOException {
12 | BufferedReader in = new BufferedReader(
13 | new FileReader(filename));
14 | String s;
15 | StringBuilder sb = new StringBuilder();
16 | while ((s = in.readLine()) != null) {
17 | sb.append(s).append("\n");
18 | }
19 | in.close();
20 | return sb.toString();
21 | }
22 |
23 | public static void main(String[] args) throws IOException {
24 | String file = BufferedInputFile.class.getResource("/").getPath()
25 | + "/infile.txt";
26 | System.out.print(read(file));
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java-io/src/main/java/com/brianway/learning/java/io/Echo.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.io;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.IOException;
5 | import java.io.InputStreamReader;
6 | import java.io.PrintWriter;
7 |
8 | /**
9 | * Created by brian on 16/11/28.
10 | *
11 | * 从标准输入中读取,并将 System.out 转换成 PrintWriter
12 | */
13 | public class Echo {
14 | public static void main(String[] args) throws IOException {
15 | BufferedReader stdin = new BufferedReader(
16 | new InputStreamReader(System.in));
17 | PrintWriter out = new PrintWriter(System.out, true);// 开启自动清空
18 |
19 | String s;
20 | while ((s = stdin.readLine()) != null && s.length() != 0) {
21 | //System.out.println(s);
22 | out.println(s);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/java-io/src/main/resources/infile.txt:
--------------------------------------------------------------------------------
1 | -----------------------------------------
2 | public static String read(String filename) throws IOException {
3 | BufferedReader in = new BufferedReader(
4 | new FileReader(filename));
5 | String s;
6 | StringBuilder sb = new StringBuilder();
7 | while ((s = in.readLine()) != null) {
8 | sb.append(s).append("\n");
9 | }
10 | in.close();
11 | return sb.toString();
12 | }
--------------------------------------------------------------------------------
/java-jvm/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | java-learning
7 | com.brianway.learning.java
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | java-jvm
13 |
14 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/ClinitOrder.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/20.
5 | * () 方法执行顺序
6 | */
7 | public class ClinitOrder {
8 | static class Parent {
9 | public static int A = 1;
10 |
11 | static {
12 | System.out.println("execute before A = 2, A now is " + A);
13 | A = 2;
14 | }
15 | }
16 |
17 | static class Sub extends Parent {
18 | public static int B = A;
19 | }
20 |
21 |
22 | public static void main(String[] args) {
23 | System.out.println(Sub.B);
24 | }
25 | }
26 |
27 |
28 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/ConstClass.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/19.
5 | * 被动使用类字段演示
6 | * 常量在编译阶段会存入调用类的常量池,本质上没有引用调用常量的类,
7 | * 不会触发定义常量的类的初始化
8 | */
9 | public class ConstClass {
10 | static {
11 | System.out.println("ConsClass init!");
12 | }
13 |
14 | public static final String HELLOWORLD = "hello world";
15 | }
16 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/DeadLoopClass.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/20.
5 | * 字段解析
6 | * 多个线程同时初始化一个类,只有一个线程会执行 ()方法,其他被阻塞
7 | */
8 | public class DeadLoopClass {
9 | static {
10 | if (true) {
11 | System.out.println(Thread.currentThread() + " init DeadLoopClass");
12 | while (true) {
13 |
14 | }
15 | }
16 | }
17 |
18 | public static void main(String[] args) {
19 | Runnable script = () -> {
20 | System.out.println(Thread.currentThread() + " start");
21 | DeadLoopClass dlc = new DeadLoopClass();
22 | System.out.println(Thread.currentThread() + " run over");
23 | };
24 |
25 | Thread thread1 = new Thread(script);
26 | Thread thread2 = new Thread(script);
27 | thread1.start();
28 | thread2.start();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/FieldResolution.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/20.
5 | * 字段解析
6 | * 如果注释了 Sub 类中的 "public static int A = 4",会编译错误
7 | */
8 | public class FieldResolution {
9 | interface Interface0 {
10 | int A = 0;
11 | }
12 |
13 | interface Interface1 extends Interface0 {
14 | int A = 1;
15 | }
16 |
17 | interface Interface2 {
18 | int A = 2;
19 | }
20 |
21 | static class Parent implements Interface1 {
22 | public static int A = 3;
23 | }
24 |
25 | static class Sub extends Parent implements Interface2 {
26 | public static int A = 4;// 注释此句试试
27 | }
28 |
29 | public static void main(String[] args) {
30 | System.out.println(Sub.A);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/NoInitialization.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/19.
5 | * 非主动使用类字段演示
6 | * 1. 静态字段只有直接定义这个字段的类才会被初始化
7 | * 2. 通过数组来定义引用类,不会触发类的初始化
8 | * (-XX:+TraceClassLoading,对于 HotSpot 虚拟机可观察到子类的加载)
9 | */
10 | public class NoInitialization {
11 | public static void main(String[] args) {
12 | System.out.println(SubClass.value);
13 | SubClass[] sca = new SubClass[10];
14 |
15 | System.out.println(ConstClass.HELLOWORLD);
16 | }
17 | }
18 | /*
19 | SuperClass init!
20 | 123
21 | */
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SimpleClass.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/15.
5 | * 一段简单的 Java 代码,用于分析字节码
6 | * javap -verbose SimpleClass.java
7 | */
8 | public class SimpleClass {
9 | private int m;
10 |
11 | public int inc() {
12 | return m + 1;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SubClass.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/19.
5 | */
6 | public class SubClass extends SuperClass {
7 | static {
8 | System.out.println("SubClass init!");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/classloading/SuperClass.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.classloading;
2 |
3 | /**
4 | * Created by brian on 17/3/19.
5 | * 被动引用的例子
6 | * 通过子类引用父类的静态字段,不会导致子类初始化
7 | */
8 | public class SuperClass {
9 | static {
10 | System.out.println("SuperClass init!");
11 | }
12 |
13 | public static int value = 123;
14 | }
15 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/gc/ReferenceCountingGC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.gc;
2 |
3 | /**
4 | * Created by brian on 17/3/2.
5 | * 引用计数算法缺陷
6 | */
7 | public class ReferenceCountingGC {
8 | public Object instance = null;
9 | private static final int _1MB = 1024 * 1024;
10 |
11 | /**
12 | * 占点内存,以便 GC 日志观看
13 | */
14 | private byte[] bigSize = new byte[2 * _1MB];
15 |
16 | public static void main(String[] args) {
17 | testGC();
18 | }
19 |
20 | public static void testGC() {
21 | ReferenceCountingGC objA = new ReferenceCountingGC();
22 | ReferenceCountingGC objB = new ReferenceCountingGC();
23 | objA.instance = objB;
24 | objB.instance = objA;
25 |
26 | objA = null;
27 | objB = null;
28 |
29 | System.gc();
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/memory/DirectMemoryOOM.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.memory;
2 |
3 | import sun.misc.Unsafe;
4 |
5 | import java.lang.reflect.Field;
6 |
7 | /**
8 | * Created by brian on 17/3/2.
9 | * 使用 unsafe 分配本机内存
10 | * VM Args: -Xmx20M -XX:MaxDirectMemorySize=10M
11 | */
12 | public class DirectMemoryOOM {
13 | private static final int _1MB = 1024 * 1024;
14 |
15 | public static void main(String[] args) throws Exception {
16 | Field unsafeField = Unsafe.class.getDeclaredFields()[0];
17 | unsafeField.setAccessible(true);
18 | Unsafe unsafe = (Unsafe) unsafeField.get(null);
19 |
20 | while (true) {
21 | unsafe.allocateMemory(_1MB);
22 | }
23 | }
24 | }
25 |
26 | /*
27 | TODO 没出现 OOM
28 | */
--------------------------------------------------------------------------------
/java-jvm/src/main/java/com/brianway/learning/java/jvm/methodinvoke/StaticResolution.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.jvm.methodinvoke;
2 |
3 | /**
4 | * Created by brian on 17/3/20.
5 | * 方法静态解析演示
6 | * javac -verbose StaticResolution.java
7 | * javap -verbose StaticResolution
8 | */
9 | public class StaticResolution {
10 | public static void sayHello() {
11 | System.out.println("hello world");
12 | }
13 |
14 | public static void main(String[] args) {
15 | StaticResolution.sayHello();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | java-learning
7 | com.brianway.learning.java
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | java-multithread
13 |
14 |
15 |
16 | junit
17 | junit
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/concurrent/CachedThreadPool.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.concurrent;
2 |
3 | import java.util.concurrent.ExecutorService;
4 | import java.util.concurrent.Executors;
5 |
6 | /**
7 | * Created by brian on 16/11/30.
8 | */
9 | public class CachedThreadPool {
10 | public static void main(String[] args) {
11 | ExecutorService exec = Executors.newCachedThreadPool();
12 | for (int i = 0; i < 5; i++) {
13 | exec.execute(new LiftOff());
14 | }
15 | exec.shutdown();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/concurrent/DaemonThreadFactory.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.concurrent;
2 |
3 | import java.util.concurrent.ThreadFactory;
4 |
5 | /**
6 | * Created by brian on 16/12/1.
7 | */
8 | public class DaemonThreadFactory implements ThreadFactory {
9 | @Override
10 | public Thread newThread(Runnable r) {
11 | Thread t = new Thread(r);
12 | t.setDaemon(true);
13 | return t;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/concurrent/FixedThreadPool.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.concurrent;
2 |
3 | import java.util.concurrent.ExecutorService;
4 | import java.util.concurrent.Executors;
5 |
6 | /**
7 | * Created by brian on 16/11/30.
8 | */
9 | public class FixedThreadPool {
10 | public static void main(String[] args) {
11 | ExecutorService exec = Executors.newFixedThreadPool(5);
12 | for (int i = 0; i < 5; i++) {
13 | exec.execute(new LiftOff());
14 | }
15 | exec.shutdown();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/concurrent/LiftOff.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.concurrent;
2 |
3 | /**
4 | * Created by brian on 16/11/30.
5 | */
6 | public class LiftOff implements Runnable {
7 | protected int countDown = 10;
8 | private static int taskCount = 0;
9 | private final int id = taskCount++;
10 |
11 | public LiftOff() {
12 | }
13 |
14 | public LiftOff(int countDown) {
15 | this.countDown = countDown;
16 | }
17 |
18 | public String status() {
19 | return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + "), ";
20 | }
21 |
22 | @Override
23 | public void run() {
24 | while (countDown-- > 0) {
25 | System.out.print(status());
26 | Thread.yield();
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/concurrent/MoreBasicThreads.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.concurrent;
2 |
3 | /**
4 | * Created by brian on 16/11/30.
5 | */
6 | public class MoreBasicThreads {
7 | public static void main(String[] args) {
8 | for (int i = 0; i < 5; i++) {
9 | new Thread(new LiftOff()).start();
10 | }
11 | System.out.println("Waiting for LiftOff");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SingleThreadExecutor.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.concurrent;
2 |
3 | import java.util.concurrent.ExecutorService;
4 | import java.util.concurrent.Executors;
5 |
6 | /**
7 | * Created by brian on 16/11/30.
8 | */
9 | public class SingleThreadExecutor {
10 | public static void main(String[] args) {
11 | ExecutorService exec = Executors.newSingleThreadExecutor();
12 | for (int i = 0; i < 5; i++) {
13 | exec.execute(new LiftOff());
14 | }
15 | exec.shutdown();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/concurrent/SleepingTask.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.concurrent;
2 |
3 | import java.util.concurrent.ExecutorService;
4 | import java.util.concurrent.Executors;
5 | import java.util.concurrent.TimeUnit;
6 |
7 | /**
8 | * Created by brian on 16/11/30.
9 | */
10 | public class SleepingTask extends LiftOff {
11 | @Override
12 | public void run() {
13 | try {
14 | while (countDown-- > 0) {
15 | System.out.print(status());
16 | TimeUnit.MILLISECONDS.sleep(100);
17 | }
18 | } catch (InterruptedException e) {
19 | System.err.println("Interrupted");
20 | }
21 | }
22 |
23 | public static void main(String[] args) {
24 | ExecutorService exec = Executors.newCachedThreadPool();
25 | for (int i = 0; i < 5; i++) {
26 | exec.execute(new SleepingTask());
27 | }
28 | exec.shutdown();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/MyList.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example1;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | /**
7 | * Created by Brian on 2016/4/13.
8 | */
9 | public class MyList {
10 | private List list = new ArrayList();
11 |
12 | public void add() {
13 | list.add("brian");
14 | }
15 |
16 | public int size() {
17 | return list.size();
18 | }
19 | }
20 |
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class ThreadA extends Thread {
7 | private MyList list;
8 |
9 | public ThreadA(MyList list) {
10 | super();
11 | this.list = list;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | for (int i = 0; i < 10; i++) {
17 | list.add();
18 | System.out.println("添加了" + (i + 1) + "元素");
19 | try {
20 | Thread.sleep(1000);
21 | } catch (InterruptedException e) {
22 | e.printStackTrace();
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example1/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class ThreadB extends Thread {
7 | private MyList list;
8 |
9 | public ThreadB(MyList list) {
10 | super();
11 | this.list = list;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | try {
17 | while (true) {
18 | //System.out.println("in b while: "+list.size());
19 | //synchronized ("any"){}
20 | if (list.size() == 5) {
21 | System.out.println("达到size了,线程b要退出了");
22 | throw new InterruptedException();
23 | }
24 | }
25 | } catch (InterruptedException e) {
26 | e.printStackTrace();
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/C_Thread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example10;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class C_Thread extends Thread {
7 | private Consumer c;
8 |
9 | public C_Thread(Consumer c) {
10 | super();
11 | this.c = c;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | c.popService();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Consumer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example10;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Consumer {
7 | private MyStack myStack;
8 |
9 | public Consumer(MyStack myStack) {
10 | super();
11 | this.myStack = myStack;
12 | }
13 |
14 | public void popService() {
15 | System.out.println("pop = " + myStack.pop() + " Consumer的popService方法中打印pop返回值");
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/P_Thread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example10;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class P_Thread extends Thread {
7 | private Producer p;
8 |
9 | public P_Thread(Producer p) {
10 | super();
11 | this.p = p;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | p.pushService();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example10/Producer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example10;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Producer {
7 | private MyStack myStack;
8 |
9 | public Producer(MyStack myStack) {
10 | super();
11 | this.myStack = myStack;
12 | }
13 |
14 | public void pushService() {
15 | myStack.push();
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/C_Thread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class C_Thread extends Thread {
7 | private Consumer c;
8 |
9 | public C_Thread(Consumer c) {
10 | super();
11 | this.c = c;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | c.popService();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/Consumer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Consumer {
7 | private MyStack myStack;
8 |
9 | public Consumer(MyStack myStack) {
10 | super();
11 | this.myStack = myStack;
12 | }
13 |
14 | public void popService() {
15 | System.out.println("pop = " + myStack.pop() + " Consumer的popService方法中打印pop返回值");
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/P_Thread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class P_Thread extends Thread {
7 | private Producer p;
8 |
9 | public P_Thread(Producer p) {
10 | super();
11 | this.p = p;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | p.pushService();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example11/Producer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Producer {
7 | private MyStack myStack;
8 |
9 | public Producer(MyStack myStack) {
10 | super();
11 | this.myStack = myStack;
12 | }
13 |
14 | public void pushService() {
15 | myStack.push();
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ReadData.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example12;
2 |
3 | import java.io.IOException;
4 | import java.io.PipedInputStream;
5 |
6 | /**
7 | * Created by Brian on 2016/4/14.
8 | */
9 | public class ReadData {
10 | public void readMethod(PipedInputStream input) {
11 | try {
12 | System.out.println("read :");
13 | byte[] bytes = new byte[20];
14 | int readLength = input.read(bytes);
15 | while (readLength != -1) {
16 | String newData = new String(bytes, 0, readLength);
17 | System.out.print(newData);
18 | readLength = input.read(bytes);
19 | }
20 | } catch (IOException e) {
21 | e.printStackTrace();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadRead.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example12;
2 |
3 | import java.io.PipedInputStream;
4 |
5 | /**
6 | * Created by Brian on 2016/4/14.
7 | */
8 | public class ThreadRead extends Thread {
9 | private ReadData read;
10 | private PipedInputStream input;
11 |
12 | public ThreadRead(ReadData read, PipedInputStream input) {
13 | super();
14 | this.input = input;
15 | this.read = read;
16 | }
17 |
18 | @Override
19 | public void run() {
20 | read.readMethod(input);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/ThreadWrite.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example12;
2 |
3 | import java.io.PipedOutputStream;
4 |
5 | /**
6 | * Created by Brian on 2016/4/14.
7 | */
8 | public class ThreadWrite extends Thread {
9 | private WriteData write;
10 | private PipedOutputStream out;
11 |
12 | public ThreadWrite(WriteData write, PipedOutputStream out) {
13 | super();
14 | this.write = write;
15 | this.out = out;
16 | }
17 |
18 | @Override
19 | public void run() {
20 | write.writeMethod(out);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example12/WriteData.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example12;
2 |
3 | import java.io.IOException;
4 | import java.io.PipedOutputStream;
5 |
6 | /**
7 | * Created by Brian on 2016/4/14.
8 | */
9 | public class WriteData {
10 | public void writeMethod(PipedOutputStream out) {
11 | try {
12 | System.out.println("write :");
13 | for (int i = 0; i < 300; i++) {
14 | String outData = "" + (i + 1);
15 | out.write(outData.getBytes());
16 | System.out.print(outData);
17 | }
18 | System.out.println();
19 | out.close();
20 | } catch (IOException e) {
21 | e.printStackTrace();
22 | }
23 |
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example13;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class BackupA extends Thread {
7 | private DBTools dbTools;
8 |
9 | public BackupA(DBTools dbTools) {
10 | super();
11 | this.dbTools = dbTools;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | dbTools.backupA();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example13/BackupB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example13;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class BackupB extends Thread {
7 | private DBTools dbTools;
8 |
9 | public BackupB(DBTools dbTools) {
10 | super();
11 | this.dbTools = dbTools;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | dbTools.backupB();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/Run14_joinExption.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example14;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 |
7 | /**
8 | * P181
9 | * join的异常
10 | * 线程b被中断了,但a还在正常运行
11 | */
12 | public class Run14_joinExption {
13 | public static void main(String[] args) {
14 | try {
15 | ThreadB b = new ThreadB();
16 | b.start();
17 | Thread.sleep(500);
18 | ThreadC c = new ThreadC(b);
19 | c.start();
20 | } catch (InterruptedException e) {
21 | e.printStackTrace();
22 | }
23 | }
24 | }
25 |
26 | /*
27 | 输出:
28 | 线程B在catch处打印了
29 | java.lang.InterruptedException
30 | at java.lang.Object.wait(Native Method)
31 | at java.lang.Thread.join(Thread.java:1245)
32 | at java.lang.Thread.join(Thread.java:1319)
33 | at com.brianway.learning.java.multithread.communication.example14.ThreadB.run(ThreadB.java:12)
34 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example14;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadA extends Thread {
7 | @Override
8 | public void run() {
9 | for (int i = 0; i < Integer.MAX_VALUE; i++) {
10 | String newString = new String();
11 | Math.random();
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example14;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadB extends Thread {
7 | @Override
8 | public void run() {
9 | try {
10 | ThreadA a = new ThreadA();
11 | a.start();
12 | a.join();
13 | System.out.println("线程B在run end处打印了");
14 | } catch (InterruptedException e) {
15 | System.out.println("线程B在catch处打印了");
16 | e.printStackTrace();
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example14/ThreadC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example14;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadC extends Thread {
7 |
8 | private ThreadB b;
9 |
10 | public ThreadC(ThreadB b) {
11 | super();
12 | this.b = b;
13 | }
14 |
15 | @Override
16 | public void run() {
17 | b.interrupt();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/Run15_join_sleep.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 |
7 | /**
8 | * P185
9 | * join(long)和sleep(long)的区别
10 | * sleep(long)方法不释放锁
11 | */
12 | public class Run15_join_sleep {
13 | public static void main(String[] args) {
14 | try {
15 | ThreadB b = new ThreadB();
16 | ThreadA a = new ThreadA(b);
17 | a.start();
18 | Thread.sleep(1000);
19 | ThreadC c = new ThreadC(b);
20 | c.start();
21 | } catch (InterruptedException e) {
22 | e.printStackTrace();
23 | }
24 | }
25 | }
26 |
27 | /*
28 | 输出:
29 | b run begin timer=1460637031625
30 | b run end timer=1460637036626
31 | 打印了bService timer=1460637037626
32 |
33 |
34 |
35 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadA extends Thread {
7 | private ThreadB b;
8 |
9 | public ThreadA(ThreadB b) {
10 | super();
11 | this.b = b;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | try {
17 | synchronized (b) {
18 | b.start();
19 | Thread.sleep(6000);
20 | }
21 | } catch (InterruptedException e) {
22 | e.printStackTrace();
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadB extends Thread {
7 | @Override
8 | public void run() {
9 | try {
10 | System.out.println("b run begin timer=" + System.currentTimeMillis());
11 | Thread.sleep(5000);
12 | System.out.println("b run end timer=" + System.currentTimeMillis());
13 | } catch (InterruptedException e) {
14 | e.printStackTrace();
15 | }
16 | }
17 |
18 | synchronized public void bService() {
19 | System.out.println("打印了bService timer=" + System.currentTimeMillis());
20 | }
21 |
22 | }
23 |
24 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example15/ThreadC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadC extends Thread {
7 |
8 | private ThreadB b;
9 |
10 | public ThreadC(ThreadB b) {
11 | super();
12 | this.b = b;
13 | }
14 |
15 | @Override
16 | public void run() {
17 | b.bService();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/InheritableThreadLocalExt.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example16;
2 |
3 | import java.util.Date;
4 |
5 | /**
6 | * Created by Brian on 2016/4/14.
7 | */
8 | public class InheritableThreadLocalExt extends InheritableThreadLocal {
9 | @Override
10 | protected Object initialValue() {
11 | return new Date().getTime();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/InheritableThreadLocalExt2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example16;
2 |
3 | import java.util.Date;
4 |
5 | /**
6 | * Created by Brian on 2016/4/14.
7 | */
8 | public class InheritableThreadLocalExt2 extends InheritableThreadLocal {
9 | @Override
10 | protected Object initialValue() {
11 | return new Date().getTime();
12 | }
13 |
14 | @Override
15 | protected Object childValue(Object parentValue) {
16 | return parentValue + "我在子线程加的~";
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example16;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadA extends Thread {
7 | @Override
8 | public void run() {
9 | try {
10 | for (int i = 0; i < 10; i++) {
11 | System.out.println("在ThreadA线程中取值=" + Tools.tl.get());
12 | Thread.sleep(100);
13 | }
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example16;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadB extends Thread {
7 | @Override
8 | public void run() {
9 | try {
10 | for (int i = 0; i < 10; i++) {
11 | System.out.println("在ThreadB线程中取值=" + Tools.itl.get());
12 | Thread.sleep(100);
13 | }
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example16;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadC extends Thread {
7 | @Override
8 | public void run() {
9 | try {
10 | for (int i = 0; i < 10; i++) {
11 | System.out.println("在ThreadC线程中取值=" + Tools.itl2.get());
12 | Thread.sleep(100);
13 | }
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/ThreadLocalExt.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example16;
2 |
3 | import java.util.Date;
4 |
5 | /**
6 | * Created by Brian on 2016/4/14.
7 | */
8 | public class ThreadLocalExt extends ThreadLocal {
9 | @Override
10 | protected Object initialValue() {
11 | return new Date().getTime();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example16/Tools.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example16;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Tools {
7 | public static ThreadLocalExt tl = new ThreadLocalExt();
8 | public static InheritableThreadLocalExt itl = new InheritableThreadLocalExt();
9 | public static InheritableThreadLocalExt2 itl2 = new InheritableThreadLocalExt2();
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Run2_wait.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 |
7 | /**
8 | * P137
9 | * wait()永远阻塞
10 | */
11 | public class Run2_wait {
12 | public static void main(String[] args) {
13 | try {
14 | String lock = new String();
15 | System.out.println("syn上面");
16 | synchronized (lock) {
17 | System.out.println("syn第一行,wait前面");
18 | lock.wait();
19 | System.out.println("wait下面的代码");
20 | }
21 | System.out.println("syn下面的代码");
22 | } catch (InterruptedException e) {
23 | e.printStackTrace();
24 | }
25 | }
26 | }
27 |
28 | /*
29 | 输出:
30 | syn上面
31 | syn第一行,wait前面
32 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class Thread1 extends Thread {
7 | private Object lock;
8 |
9 | public Thread1(Object lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | try {
17 | synchronized (lock) {
18 | System.out.println("开始 wait time=" + System.currentTimeMillis());
19 | lock.wait();
20 | System.out.println("结束 wait time=" + System.currentTimeMillis());
21 | }
22 | } catch (InterruptedException e) {
23 | e.printStackTrace();
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example2/Thread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class Thread2 extends Thread {
7 | private Object lock;
8 |
9 | public Thread2(Object lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | @Override
15 | public void run() {
16 |
17 | synchronized (lock) {
18 | System.out.println("开始 notify time=" + System.currentTimeMillis());
19 | lock.notify();
20 | try {
21 | Thread.sleep(2000);
22 | } catch (InterruptedException e) {
23 | e.printStackTrace();
24 | }
25 | System.out.println("结束 notify time=" + System.currentTimeMillis());
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/MyThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example3;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 | public class MyThread extends Thread {
7 | private Object lock;
8 |
9 | public MyThread(Object lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | Service service = new Service();
17 | service.testMethod(lock);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/NotifyThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example3;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 | public class NotifyThread extends Thread {
7 | private Object lock;
8 |
9 | public NotifyThread(Object lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | synchronized (lock) {
17 | lock.notify();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/NotifyThread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example3;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 | public class NotifyThread2 extends Thread {
7 | private Object lock;
8 |
9 | public NotifyThread2(Object lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | synchronized (lock) {
17 | lock.notify();
18 | lock.notify();
19 | lock.notify();
20 | lock.notify();
21 |
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/NotifyThread3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example3;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 | public class NotifyThread3 extends Thread {
7 | private Object lock;
8 |
9 | public NotifyThread3(Object lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | synchronized (lock) {
17 | lock.notifyAll();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/Run3_notifyMany.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example3;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 |
7 | /**
8 | * P150
9 | * 通知多个线程
10 | */
11 | public class Run3_notifyMany {
12 | public static void main(String[] args) throws InterruptedException {
13 | Object lock = new Object();
14 | MyThread a = new MyThread(lock);
15 | a.start();
16 | MyThread b = new MyThread(lock);
17 | b.start();
18 | MyThread c = new MyThread(lock);
19 | c.start();
20 |
21 | Thread.sleep(1000);
22 |
23 | NotifyThread2 notifyThread = new NotifyThread2(lock);
24 | notifyThread.start();
25 | }
26 | }
27 |
28 | /*
29 | 输出:
30 | begin wait(),ThreadName=Thread-0
31 | begin wait(),ThreadName=Thread-2
32 | begin wait(),ThreadName=Thread-1
33 | end wait(),ThreadName=Thread-0
34 | end wait(),ThreadName=Thread-1
35 | end wait(),ThreadName=Thread-2
36 |
37 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/Run3_notifyOne.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example3;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 |
7 | /**
8 | * P149
9 | * 通知一个线程
10 | */
11 | public class Run3_notifyOne {
12 | public static void main(String[] args) throws InterruptedException {
13 | Object lock = new Object();
14 | MyThread a = new MyThread(lock);
15 | a.start();
16 | MyThread b = new MyThread(lock);
17 | b.start();
18 | MyThread c = new MyThread(lock);
19 | c.start();
20 |
21 | Thread.sleep(1000);
22 |
23 | NotifyThread notifyThread = new NotifyThread(lock);
24 | notifyThread.start();
25 | }
26 | }
27 |
28 | /*
29 | 输出:
30 | begin wait(),ThreadName=Thread-1
31 | begin wait(),ThreadName=Thread-2
32 | begin wait(),ThreadName=Thread-0
33 | end wait(),ThreadName=Thread-1
34 |
35 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example3/Service.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example3;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 | public class Service {
7 | public void testMethod(Object lock) {
8 | try {
9 | synchronized (lock) {
10 | System.out.println("begin wait(),ThreadName=" + Thread.currentThread().getName());
11 | lock.wait();
12 | System.out.println("end wait(),ThreadName=" + Thread.currentThread().getName());
13 | }
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example5/Run5_notify.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example5;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 |
7 | /**
8 | * P154
9 | * notify正常通知
10 | */
11 | public class Run5_notify {
12 | public static void main(String[] args) throws InterruptedException {
13 | MyRun myRun = new MyRun();
14 | Thread a = new Thread(myRun.runnableWait);
15 | a.start();
16 | Thread.sleep(100);
17 | Thread b = new Thread(myRun.runnableNotify);
18 | b.start();
19 | }
20 |
21 | }
22 |
23 | /*
24 | 输出:
25 | wait begin timer=1460567668037
26 | notify begin timer=1460567668137
27 | notify end timer=1460567668137
28 | wait end timer=1460567668137
29 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example5/Run5_notifyEarly.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example5;
2 |
3 | /**
4 | * Created by brian on 2016/4/14.
5 | */
6 |
7 | /**
8 | * P154
9 | * notify通知过早
10 | */
11 | public class Run5_notifyEarly {
12 | public static void main(String[] args) throws InterruptedException {
13 | MyRun myRun = new MyRun();
14 | Thread b = new Thread(myRun.runnableNotify);
15 | b.start();
16 | Thread.sleep(100);
17 | Thread a = new Thread(myRun.runnableWait);
18 | a.start();
19 | }
20 |
21 | }
22 |
23 | /*
24 | 输出:
25 | notify begin timer=1460567514794
26 | notify end timer=1460567514794
27 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/Add.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Add {
7 | private String lock;
8 |
9 | public Add(String lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | public void add() {
15 | synchronized (lock) {
16 | ValueObject.list.add("anyString");
17 | lock.notifyAll();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/ThreadAdd.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadAdd extends Thread {
7 | private Add add;
8 |
9 | public ThreadAdd(String name, Add add) {
10 | super(name);
11 | this.add = add;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | add.add();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/ThreadSubtract.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadSubtract extends Thread {
7 | private Subtract subtract;
8 |
9 | public ThreadSubtract(String name, Subtract subtract) {
10 | super(name);
11 | this.subtract = subtract;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | subtract.subtract();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example6/ValueObject.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example6;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | /**
7 | * Created by Brian on 2016/4/14.
8 | */
9 | public class ValueObject {
10 | public static List list = new ArrayList();
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/Consumer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Consumer {
7 | private String lock;
8 |
9 | public Consumer(String lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | public void getValue() {
15 | try {
16 | synchronized (lock) {
17 | if (ValueObject.value.equals("")) {
18 | lock.wait();
19 | }
20 | System.out.println("get的值是" + ValueObject.value);
21 | ValueObject.value = "";
22 | lock.notify();
23 | }
24 | } catch (InterruptedException e) {
25 | e.printStackTrace();
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/ThreadC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadC extends Thread {
7 | private Consumer c;
8 |
9 | public ThreadC(Consumer c) {
10 | super();
11 | this.c = c;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | c.getValue();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/ThreadP.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadP extends Thread {
7 | private Producer p;
8 |
9 | public ThreadP(Producer p) {
10 | super();
11 | this.p = p;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | p.setValue();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/ValueObject.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ValueObject {
7 | public static String value = "";
8 | }
9 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example7/producer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Producer {
7 | private String lock;
8 |
9 | public Producer(String lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | public void setValue() {
15 | try {
16 | synchronized (lock) {
17 | if (!ValueObject.value.equals("")) {
18 | lock.wait();
19 | }
20 | String value = System.currentTimeMillis() + "_" + System.nanoTime();
21 | System.out.println("set的值是" + value);
22 | ValueObject.value = value;
23 | lock.notify();
24 | }
25 | } catch (InterruptedException e) {
26 | e.printStackTrace();
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/Consumer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Consumer {
7 | private String lock;
8 |
9 | public Consumer(String lock) {
10 | super();
11 | this.lock = lock;
12 | }
13 |
14 | public void getValue() {
15 | try {
16 | synchronized (lock) {
17 | while (ValueObject.value.equals("")) {
18 | System.out.println("消费者 " + Thread.currentThread().getName() + " WAITING了☆");
19 | lock.wait();
20 | }
21 | System.out.println("消费者 " + Thread.currentThread().getName() + " RUNNABLE了");
22 | ValueObject.value = "";
23 | lock.notify();
24 | }
25 | } catch (InterruptedException e) {
26 | e.printStackTrace();
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/ThreadC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadC extends Thread {
7 | private Consumer c;
8 |
9 | public ThreadC(Consumer c) {
10 | super();
11 | this.c = c;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | c.getValue();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/ThreadP.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ThreadP extends Thread {
7 | private Producer p;
8 |
9 | public ThreadP(Producer p) {
10 | super();
11 | this.p = p;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | p.setValue();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example8/ValueObject.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class ValueObject {
7 | public static String value = "";
8 | }
9 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/C_Thread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class C_Thread extends Thread {
7 | private Consumer c;
8 |
9 | public C_Thread(Consumer c) {
10 | super();
11 | this.c = c;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | c.popService();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/Consumer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Consumer {
7 | private MyStack myStack;
8 |
9 | public Consumer(MyStack myStack) {
10 | super();
11 | this.myStack = myStack;
12 | }
13 |
14 | public void popService() {
15 | System.out.println("pop = " + myStack.pop() + " Consumer的popService方法中打印pop返回值");
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/P_Thread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class P_Thread extends Thread {
7 | private Producer p;
8 |
9 | public P_Thread(Producer p) {
10 | super();
11 | this.p = p;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | while (true) {
17 | p.pushService();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/communication/example9/Producer.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.communication.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/14.
5 | */
6 | public class Producer {
7 | private MyStack myStack;
8 |
9 | public Producer(MyStack myStack) {
10 | super();
11 | this.myStack = myStack;
12 | }
13 |
14 | public void pushService() {
15 | myStack.push();
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotify.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example1;
2 |
3 | /**
4 | * Created by brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P206
9 | * 使用Condition实现等待通知
10 | * Condition对象的await()方法,线程WAITING
11 | */
12 | public class Run1_UseConditionWaitNotify {
13 | public static void main(String[] args) {
14 | ServiceB service = new ServiceB();
15 | ThreadB b = new ThreadB(service);
16 | b.start();
17 | }
18 | }
19 |
20 |
21 | /*
22 | 输出:
23 | A
24 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/Run1_UseConditionWaitNotifyOk.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example1;
2 |
3 | /**
4 | * Created by brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P207
9 | * 正确使用Condition实现等待通知
10 | * Object类的wait()------Condition类的await()
11 | * Object类的wait(long timeout)------Condition类的await(long time,TimeUnit unit)
12 | * Object类的notify()------Condition类的signal()
13 | * Object类的notifyAll()------Condition类的signalAll()
14 | */
15 | public class Run1_UseConditionWaitNotifyOk {
16 | public static void main(String[] args) throws InterruptedException {
17 | ServiceC service = new ServiceC();
18 | ThreadC c = new ThreadC(service);
19 | c.start();
20 | Thread.sleep(3000);
21 | service.signal();
22 | }
23 | }
24 |
25 |
26 | /*
27 | 输出:
28 | await 时间为1460651340418
29 | signal时间为1460651343418
30 | 锁释放了
31 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example1;
2 |
3 | import java.util.concurrent.locks.Condition;
4 | import java.util.concurrent.locks.Lock;
5 | import java.util.concurrent.locks.ReentrantLock;
6 |
7 | /**
8 | * Created by brian on 2016/4/15.
9 | */
10 | public class ServiceA {
11 | private Lock lock = new ReentrantLock();
12 | private Condition condition = lock.newCondition();
13 |
14 | public void await() {
15 | try {
16 | condition.await();
17 | } catch (InterruptedException e) {
18 | e.printStackTrace();
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ServiceB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example1;
2 |
3 | import java.util.concurrent.locks.Condition;
4 | import java.util.concurrent.locks.Lock;
5 | import java.util.concurrent.locks.ReentrantLock;
6 |
7 | /**
8 | * Created by brian on 2016/4/15.
9 | */
10 | public class ServiceB {
11 | private Lock lock = new ReentrantLock();
12 | private Condition condition = lock.newCondition();
13 |
14 | public void waitMethod() {
15 | try {
16 | lock.lock();
17 | System.out.println("A");
18 | condition.await();
19 | System.out.println("B");
20 | } catch (InterruptedException e) {
21 | e.printStackTrace();
22 | } finally {
23 | lock.unlock();
24 | System.out.println("锁释放了");
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example1;
2 |
3 | /**
4 | * Created by brian on 2016/4/15.
5 | */
6 | public class ThreadA extends Thread {
7 | private ServiceA service;
8 |
9 | public ThreadA(ServiceA service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.await();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example1;
2 |
3 | /**
4 | * Created by brian on 2016/4/15.
5 | */
6 | public class ThreadB extends Thread {
7 | private ServiceB service;
8 |
9 | public ThreadB(ServiceB service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.waitMethod();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example1/ThreadC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example1;
2 |
3 | /**
4 | * Created by brian on 2016/4/15.
5 | */
6 | public class ThreadC extends Thread {
7 | private ServiceC service;
8 |
9 | public ThreadC(ServiceC service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.await();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example10;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P236
9 | * 类ReentrantReadWriteLock的使用:读读共享
10 | */
11 | public class Run10_ReadWriteLockBegin1 {
12 | public static void main(String[] args) {
13 | final Service1 service = new Service1();
14 | Thread a = new Thread() {
15 | @Override
16 | public void run() {
17 | service.read();
18 | }
19 | };
20 | Thread b = new Thread() {
21 | @Override
22 | public void run() {
23 | service.read();
24 | }
25 | };
26 | a.setName("A");
27 | a.start();
28 | b.setName("B");
29 | b.start();
30 | }
31 | }
32 |
33 |
34 | /*
35 | 输出:
36 | 获得读锁A 1460726504907
37 | 获得读锁B 1460726504908
38 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example10;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P238
9 | * 类ReentrantReadWriteLock的使用:写写互斥
10 | */
11 | public class Run10_ReadWriteLockBegin2 {
12 | public static void main(String[] args) {
13 | final Service2 service = new Service2();
14 | Thread a = new Thread() {
15 | @Override
16 | public void run() {
17 | service.write();
18 | }
19 | };
20 | Thread b = new Thread() {
21 | @Override
22 | public void run() {
23 | service.write();
24 | }
25 | };
26 | a.setName("A");
27 | a.start();
28 | b.setName("B");
29 | b.start();
30 | }
31 | }
32 |
33 |
34 | /*
35 | 输出:
36 | 获得写锁A 1460727106721
37 | 获得写锁B 1460727116721
38 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Run10_ReadWriteLockBegin3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example10;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P238
9 | * 类ReentrantReadWriteLock的使用:读写互斥
10 | */
11 | public class Run10_ReadWriteLockBegin3 {
12 | public static void main(String[] args) {
13 | final Service3 service = new Service3();
14 | Thread a = new Thread() {
15 | @Override
16 | public void run() {
17 | service.read();
18 | }
19 | };
20 | Thread b = new Thread() {
21 | @Override
22 | public void run() {
23 | service.write();
24 | }
25 | };
26 | a.setName("A");
27 | a.start();
28 | b.setName("B");
29 | b.start();
30 | }
31 | }
32 |
33 |
34 | /*
35 | 输出:
36 | 获得读锁 A 1460727280066
37 | 获得写锁 B 1460727290067
38 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example10;
2 |
3 | import java.util.concurrent.locks.ReentrantReadWriteLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 |
9 | /**
10 | * TODO
11 | * 这里为什么用双try?
12 | * 以前不都是直接try catch finally的吗?
13 | */
14 | public class Service1 {
15 | private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
16 |
17 | public void read() {
18 | try {
19 | try {
20 | lock.readLock().lock();
21 | System.out.println("获得读锁" + Thread.currentThread().getName() + " " + System.currentTimeMillis());
22 | Thread.sleep(10000);
23 | } finally {
24 | lock.readLock().unlock();
25 | }
26 | } catch (InterruptedException e) {
27 | e.printStackTrace();
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example10/Service2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example10;
2 |
3 | import java.util.concurrent.locks.ReentrantReadWriteLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 |
9 | /**
10 | * TODO
11 | * 这里为什么用双try?
12 | * 以前不都是直接try catch finally的吗?
13 | */
14 | public class Service2 {
15 | private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
16 |
17 | public void write() {
18 | try {
19 | try {
20 | lock.writeLock().lock();
21 | System.out.println("获得写锁" + Thread.currentThread().getName() + " " + System.currentTimeMillis());
22 | Thread.sleep(10000);
23 | } finally {
24 | lock.writeLock().unlock();
25 | }
26 | } catch (InterruptedException e) {
27 | e.printStackTrace();
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/Run2_MustUseMoreCondition.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P210
9 | * 使用多个condition实现通知部分线程
10 | */
11 | public class Run2_MustUseMoreCondition {
12 | public static void main(String[] args) throws InterruptedException {
13 | MyService service = new MyService();
14 | ThreadA a = new ThreadA(service);
15 | a.setName("A");
16 | a.start();
17 | ThreadB b = new ThreadB(service);
18 | b.setName("B");
19 | b.start();
20 | Thread.sleep(3000);
21 | service.signalAll_A();
22 | }
23 | }
24 |
25 |
26 | /*
27 | 输出:
28 | awaitA begin时间为1460687242048 ThreadName=A
29 | awaitB begin时间为1460687242048 ThreadName=B
30 | signalAll_A 时间为1460687245048 ThreadName=main
31 | awaitA end 时间为1460687245048 ThreadName=A
32 | A锁释放了 时间为1460687245048 ThreadName=A
33 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class ThreadA extends Thread {
7 | private MyService service;
8 |
9 | public ThreadA(MyService service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.awaitA();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example2/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class ThreadB extends Thread {
7 | private MyService service;
8 |
9 | public ThreadB(MyService service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.awaitB();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class ThreadA extends Thread {
7 | private MyService service;
8 |
9 | public ThreadA(MyService service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | for (int i = 0; i < Integer.MAX_VALUE; i++) {
16 | service.set();
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example3/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class ThreadB extends Thread {
7 | private MyService service;
8 |
9 | public ThreadB(MyService service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | for (int i = 0; i < Integer.MAX_VALUE; i++) {
16 | service.get();
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example4/Service.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example4;
2 |
3 | import java.util.concurrent.locks.ReentrantLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 | public class Service {
9 | private ReentrantLock lock;
10 |
11 | public Service(boolean isFair) {
12 | this.lock = new ReentrantLock(isFair);
13 | }
14 |
15 | public void serviceMethod() {
16 | try {
17 | lock.lock();
18 | System.out.println("ThreadName=" + Thread.currentThread().getName() + "获得锁定");
19 | } finally {
20 | lock.unlock();
21 | }
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Run5_getHoldCount.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P219
9 | * 测试方法int getHoldCount()
10 | * 查询当前线程保持此锁定的个数,即调用lock()方法的次数
11 | */
12 | public class Run5_getHoldCount {
13 | public static void main(String[] args) {
14 | Service1 service = new Service1();
15 | service.serviceMethod1();
16 | }
17 | }
18 |
19 |
20 | /*
21 | 输出:
22 | serviceMethod1 getHoldCount=1
23 | serviceMethod2 getHoldCount=2
24 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Service1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example5;
2 |
3 | import java.util.concurrent.locks.ReentrantLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 | public class Service1 {
9 | private ReentrantLock lock = new ReentrantLock();
10 |
11 | public void serviceMethod1() {
12 | try {
13 | lock.lock();
14 | System.out.println("serviceMethod1 getHoldCount=" + lock.getHoldCount());
15 | serviceMethod2();
16 | } finally {
17 | lock.unlock();
18 | }
19 | }
20 |
21 | public void serviceMethod2() {
22 | try {
23 | lock.lock();
24 | System.out.println("serviceMethod2 getHoldCount=" + lock.getHoldCount());
25 | } finally {
26 | lock.unlock();
27 | }
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example5/Service2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example5;
2 |
3 | import java.util.concurrent.locks.ReentrantLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 | public class Service2 {
9 | public ReentrantLock lock = new ReentrantLock();
10 |
11 | public void serviceMethod1() {
12 | try {
13 | lock.lock();
14 | System.out.println("ThreadName=" + Thread.currentThread().getName());
15 | Thread.sleep(Integer.MAX_VALUE);
16 | } catch (InterruptedException e) {
17 | e.printStackTrace();
18 | } finally {
19 | lock.unlock();
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example6/Service1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example6;
2 |
3 | import java.util.concurrent.locks.Condition;
4 | import java.util.concurrent.locks.ReentrantLock;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class Service1 {
10 | public ReentrantLock lock = new ReentrantLock();
11 | public Condition newCondition = lock.newCondition();
12 |
13 | public void waitMethod() {
14 | try {
15 | lock.lock();
16 | Thread.sleep(Integer.MAX_VALUE);
17 | } catch (InterruptedException e) {
18 | e.printStackTrace();
19 | } finally {
20 | lock.unlock();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isFair.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P224
9 | * 测试方法boolean isFair()
10 | * 判断是不是公平锁
11 | */
12 | public class Run7_isFair {
13 | public static void main(String[] args) {
14 | final Service1 service = new Service1(true);
15 | Runnable runnable = new Runnable() {
16 | public void run() {
17 | service.serviceMethod();
18 | }
19 | };
20 | Thread thread = new Thread(runnable);
21 | thread.start();
22 | final Service1 service2 = new Service1(false);
23 | runnable = new Runnable() {
24 | public void run() {
25 | service2.serviceMethod();
26 | }
27 | };
28 | thread = new Thread(runnable);
29 | thread.start();
30 |
31 | }
32 | }
33 |
34 | /*
35 | 输出:
36 | 公平锁情况:true
37 | 公平锁情况:false
38 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isHeldByCurrentThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P225
9 | * 测试方法boolean isHeldByCurrentThread()
10 | * 查询当前线程是否保持此锁定
11 | */
12 | public class Run7_isHeldByCurrentThread {
13 | public static void main(String[] args) {
14 | final Service2 service = new Service2(true);
15 | Runnable runnable = new Runnable() {
16 | public void run() {
17 | service.serviceMethod();
18 | }
19 | };
20 | Thread thread = new Thread(runnable);
21 | thread.start();
22 | }
23 | }
24 |
25 |
26 | /*
27 | 输出:
28 | false
29 | true
30 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Run7_isLocked.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P226
9 | * 测试方法boolean isLocked()
10 | * 查询此锁定是否由任意线程保持
11 | */
12 | public class Run7_isLocked {
13 | public static void main(String[] args) {
14 | final Service3 service = new Service3(true);
15 | Runnable runnable = new Runnable() {
16 | public void run() {
17 | service.serviceMethod();
18 | }
19 | };
20 |
21 | Thread thread = new Thread(runnable);
22 | thread.start();
23 | }
24 | }
25 |
26 |
27 | /*
28 | 输出:
29 | false
30 | true
31 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example7;
2 |
3 | import java.util.concurrent.locks.ReentrantLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 | public class Service1 {
9 | private ReentrantLock lock;
10 |
11 | public Service1(boolean isFair) {
12 | lock = new ReentrantLock(isFair);
13 | }
14 |
15 | public void serviceMethod() {
16 | try {
17 | lock.lock();
18 | System.out.println("公平锁情况:" + lock.isFair());
19 | } finally {
20 | lock.unlock();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example7;
2 |
3 | import java.util.concurrent.locks.ReentrantLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 | public class Service2 {
9 | private ReentrantLock lock;
10 |
11 | public Service2(boolean isFair) {
12 | lock = new ReentrantLock(isFair);
13 | }
14 |
15 | public void serviceMethod() {
16 | try {
17 | System.out.println(lock.isHeldByCurrentThread());
18 | lock.lock();
19 | System.out.println(lock.isHeldByCurrentThread());
20 | } finally {
21 | lock.unlock();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example7/Service3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example7;
2 |
3 | import java.util.concurrent.locks.ReentrantLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 | public class Service3 {
9 | private ReentrantLock lock;
10 |
11 | public Service3(boolean isFair) {
12 | lock = new ReentrantLock(isFair);
13 | }
14 |
15 | public void serviceMethod() {
16 | try {
17 | System.out.println(lock.isLocked());
18 | lock.lock();
19 | System.out.println(lock.isLocked());
20 | } finally {
21 | lock.unlock();
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Run8_tryLock.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P228
9 | * 测试方法boolean tryLock()
10 | * 仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定
11 | */
12 | public class Run8_tryLock {
13 | public static void main(String[] args) {
14 | final Service3 service = new Service3();
15 | Runnable runnable = new Runnable() {
16 | public void run() {
17 | service.waitMethod();
18 | }
19 | };
20 |
21 | Thread threadA = new Thread(runnable);
22 | threadA.setName("A");
23 | threadA.start();
24 |
25 | Thread threadB = new Thread(runnable);
26 | threadB.setName("B");
27 | threadB.start();
28 | }
29 | }
30 |
31 | /*
32 | 输出:
33 | B获得锁
34 | A没有获得锁
35 |
36 | ------------------
37 |
38 | A获得锁
39 | B没有获得锁
40 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example8;
2 |
3 | import java.util.concurrent.locks.Condition;
4 | import java.util.concurrent.locks.ReentrantLock;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class Service1 {
10 | public ReentrantLock lock = new ReentrantLock();
11 | private Condition condition = lock.newCondition();
12 |
13 | public void waitMethod() {
14 | try {
15 | lock.lock();
16 | System.out.println("lock begin " + Thread.currentThread().getName());
17 | for (int i = 0; i < Integer.MAX_VALUE / 10; i++) {
18 | String s = new String();
19 | Math.random();
20 | }
21 | System.out.println("lock end " + Thread.currentThread().getName());
22 | } finally {
23 | if (lock.isHeldByCurrentThread()) {
24 | lock.unlock();
25 | }
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example8;
2 |
3 | import java.util.concurrent.locks.ReentrantLock;
4 |
5 | /**
6 | * Created by Brian on 2016/4/15.
7 | */
8 | public class Service3 {
9 | public ReentrantLock lock = new ReentrantLock();
10 |
11 | public void waitMethod() {
12 | if (lock.tryLock()) {
13 | System.out.println(Thread.currentThread().getName() + "获得锁");
14 | } else {
15 | System.out.println(Thread.currentThread().getName() + "没有获得锁");
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example8/Service4.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example8;
2 |
3 | import java.util.concurrent.TimeUnit;
4 | import java.util.concurrent.locks.ReentrantLock;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class Service4 {
10 | public ReentrantLock lock = new ReentrantLock();
11 |
12 | public void waitMethod() {
13 | try {
14 | if (lock.tryLock(3, TimeUnit.SECONDS)) {
15 | System.out.println(Thread.currentThread().getName() + "获得锁的时间:" + System.currentTimeMillis());
16 | Thread.sleep(10000);
17 | } else {
18 | System.out.println(Thread.currentThread().getName() + "没有获得锁");
19 | }
20 | } catch (InterruptedException e) {
21 | e.printStackTrace();
22 | } finally {
23 | if (lock.isHeldByCurrentThread()) {
24 | lock.unlock();
25 | }
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUniterruptibly2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P232
9 | * 测试方法awaitUniterruptibly()
10 | */
11 | public class Run9_awaitUniterruptibly2 {
12 | public static void main(String[] args) {
13 | try {
14 | Service2 service = new Service2();
15 | Thread2 thread = new Thread2(service);
16 | thread.start();
17 | Thread.sleep(3000);
18 | thread.interrupt();
19 | } catch (InterruptedException e) {
20 | e.printStackTrace();
21 | }
22 | }
23 | }
24 |
25 | /*
26 | 输出:
27 | wait begin
28 |
29 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P233
9 | * 测试方法awaitUntil()
10 | * 到达等待时间可唤醒自己
11 | */
12 | public class Run9_awaitUntil1 {
13 | public static void main(String[] args) {
14 | Service service = new Service();
15 | ThreadA threadA = new ThreadA(service);
16 | threadA.start();
17 | }
18 | }
19 |
20 |
21 | /*
22 | 输出:
23 | wait begin timer=1460724068711
24 | wait end timer=1460724078704
25 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Run9_awaitUntil2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 |
7 | /**
8 | * P233
9 | * 测试方法awaitUntil()
10 | * 线程在等待时间到达前,可以被其他线程唤醒
11 | */
12 | public class Run9_awaitUntil2 {
13 | public static void main(String[] args) throws InterruptedException {
14 | Service service = new Service();
15 | ThreadA threadA = new ThreadA(service);
16 | threadA.start();
17 | Thread.sleep(2000);
18 | ThreadB threadB = new ThreadB(service);
19 | threadB.start();
20 | }
21 | }
22 |
23 |
24 | /*
25 | 输出:
26 | wait begin timer=1460724153513
27 | notify begin timer=1460724155507
28 | notify end timer=1460724155507
29 | wait end timer=1460724155508
30 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Service1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | import java.util.concurrent.locks.Condition;
4 | import java.util.concurrent.locks.ReentrantLock;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class Service1 {
10 | private ReentrantLock lock = new ReentrantLock();
11 | private Condition condition = lock.newCondition();
12 |
13 | public void testMethod() {
14 | try {
15 | lock.lock();
16 | System.out.println("wait begin");
17 | condition.await();
18 | System.out.println("wait end");
19 | } catch (InterruptedException e) {
20 | e.printStackTrace();
21 | System.out.println("catch");
22 | } finally {
23 | lock.unlock();
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Service2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | import java.util.concurrent.locks.Condition;
4 | import java.util.concurrent.locks.ReentrantLock;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class Service2 {
10 | private ReentrantLock lock = new ReentrantLock();
11 | private Condition condition = lock.newCondition();
12 |
13 | public void testMethod() {
14 | try {
15 | lock.lock();
16 | System.out.println("wait begin");
17 | condition.awaitUninterruptibly();
18 | System.out.println("wait end");
19 | } finally {
20 | lock.unlock();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class Thread1 extends Thread {
7 | private Service1 service;
8 |
9 | public Thread1(Service1 service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.testMethod();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/Thread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class Thread2 extends Thread {
7 | private Service2 service;
8 |
9 | public Thread2(Service2 service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.testMethod();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class ThreadA extends Thread {
7 | private Service service;
8 |
9 | public ThreadA(Service service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.waitMethod();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/lock/example9/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.lock.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/15.
5 | */
6 | public class ThreadB extends Thread {
7 | private Service service;
8 |
9 | public ThreadB(Service service) {
10 | this.service = service;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | service.notifyMethod();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run16_yield.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.meet;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 |
7 | /**
8 | * P42例子
9 | * 测试yield
10 | */
11 |
12 | class MyThread16 extends Thread {
13 | @Override
14 | public void run() {
15 | long beginTime = System.currentTimeMillis();
16 | int count = 0;
17 | for (int i = 0; i < 50000000; i++) {
18 | Thread.yield();
19 | count = count + (i + 1);
20 | }
21 | long endTime = System.currentTimeMillis();
22 | System.out.println("用时:" + (endTime - beginTime) + "毫秒");
23 | }
24 | }
25 |
26 | public class Run16_yield {
27 | public static void main(String[] args) {
28 | MyThread16 myThread16 = new MyThread16();
29 | myThread16.start();
30 | }
31 | }
32 |
33 |
34 | /*
35 | //Thread.yield();
36 | 输出:
37 | 用时:2毫秒
38 |
39 | -----------------
40 |
41 | Thread.yield();
42 | 输出:
43 | 用时:3302毫秒
44 |
45 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run4_isAlive01.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.meet;
2 |
3 | /**
4 | * Created by brian on 2016/4/11.
5 | */
6 |
7 | /**
8 | * P18
9 | * isAlive()
10 | */
11 | class MyThread4 extends Thread {
12 | @Override
13 | public void run() {
14 | System.out.println("run=" + this.isAlive());
15 | }
16 | }
17 |
18 | public class Run4_isAlive01 {
19 | public static void main(String[] args) throws InterruptedException {
20 | MyThread4 myThread4 = new MyThread4();
21 | System.out.println("begin == " + myThread4.isAlive());
22 | myThread4.start();
23 | //Thread.sleep(1000);
24 | System.out.println("end == " + myThread4.isAlive());
25 | }
26 |
27 | }
28 |
29 | /*
30 | 输出:
31 | begin == false
32 | end == true
33 | run=true
34 |
35 | --------------
36 | Thread.sleep(1000);
37 |
38 | 输出:
39 | begin == false
40 | run=true
41 | end == false
42 |
43 | */
44 |
45 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run7_interrupt01.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.meet;
2 |
3 | /**
4 | * Created by brian on 2016/4/11.
5 | */
6 |
7 | /**
8 | * P23
9 | * 停止线程
10 | */
11 |
12 | class MyThread7 extends Thread {
13 | @Override
14 | public void run() {
15 | super.run();
16 | for (int i = 0; i < 500000; i++) {
17 | System.out.println("i=" + (i + 1));
18 | }
19 | }
20 | }
21 |
22 | public class Run7_interrupt01 {
23 | public static void main(String[] args) {
24 | try {
25 | MyThread7 myThread7 = new MyThread7();
26 | myThread7.start();
27 | Thread.sleep(1000);
28 | myThread7.interrupt();
29 | } catch (InterruptedException e) {
30 | System.out.println("main catch");
31 | e.printStackTrace();
32 | }
33 |
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/Run9_interrupted02.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.meet;
2 |
3 | /**
4 | * Created by brian on 2016/4/11.
5 | */
6 |
7 | /**
8 | * P26例子
9 | * 线程的中断状态由interrupted()清除
10 | */
11 | public class Run9_interrupted02 {
12 | public static void main(String[] args) {
13 | Thread.currentThread().interrupt();
14 | System.out.println("Thread.interrupted(),是否停止1?=" + Thread.interrupted());
15 | System.out.println("Thread.interrupted(),是否停止2?=" + Thread.interrupted());
16 | System.out.println("end");
17 | }
18 | }
19 |
20 | /*
21 | 输出:
22 | Thread.interrupted(),是否停止1?=true
23 | Thread.interrupted(),是否停止2?=false
24 | end
25 |
26 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/meet/printMain.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.meet;
2 |
3 | /**
4 | * Created by Brian on 2016/4/10.
5 | */
6 |
7 | /**
8 | * P4的小例子
9 | */
10 | public class printMain {
11 | public static void main(String[] args) {
12 | System.out.println(Thread.currentThread().getName());
13 | }
14 | }
15 |
16 | /*
17 | output:
18 | main
19 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject0.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * 缺点:不能有其他实例变量
9 | * getInstance()方法没有同步,可能出现非线程安全问题
10 | */
11 | public class MyObject0 {
12 | private static MyObject0 myObject = new MyObject0();
13 |
14 | private MyObject0() {
15 | }
16 |
17 | public static MyObject0 getInstance() {
18 | return myObject;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject1 {
7 | private static MyObject1 myObject;
8 |
9 | private MyObject1() {
10 | }
11 |
12 | public static MyObject1 getInstance() {
13 | //延迟加载
14 | if (myObject == null) {
15 | myObject = new MyObject1();
16 | }
17 | return myObject;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/MyObject2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject2 {
7 | private static MyObject2 myObject;
8 |
9 | private MyObject2() {
10 | }
11 |
12 | public static MyObject2 getInstance() {
13 |
14 | try {
15 | if (myObject == null) {
16 | Thread.sleep(2000);//模拟创建对象前的坐一些准备
17 | myObject = new MyObject2();
18 | }
19 | } catch (InterruptedException e) {
20 | e.printStackTrace();
21 | }
22 | return myObject;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton0.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * p262
9 | * 立即加载/“饿汉模式”
10 | */
11 | public class Run1_singleton0 {
12 | public static void main(String[] args) {
13 | Thread0 t1 = new Thread0();
14 | Thread0 t2 = new Thread0();
15 | Thread0 t3 = new Thread0();
16 | t1.start();
17 | t2.start();
18 | t3.start();
19 | }
20 | }
21 |
22 |
23 | /*
24 | 输出:
25 | 663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08
26 | 663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08
27 | 663838472 com.brianway.learning.java.multithread.singleton.example1.MyObject0@27915f08
28 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Run1_singleton2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * p265
9 | * 延迟加载/“懒汉模式”缺点展示
10 | */
11 | public class Run1_singleton2 {
12 | public static void main(String[] args) {
13 | Thread2 t1 = new Thread2();
14 | Thread2 t2 = new Thread2();
15 | Thread2 t3 = new Thread2();
16 | t1.start();
17 | t2.start();
18 | t3.start();
19 | }
20 | }
21 |
22 |
23 | /*
24 | 输出:
25 | 1771081048 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e
26 | 1802892302 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e
27 | 974814630 com.brianway.learning.java.multithread.singleton.example1.MyObject2@6b75f40e
28 |
29 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread0.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread0 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject0.getInstance().hashCode() + " " + MyObject0.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread1 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject1.getInstance().hashCode() + " " + MyObject1.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example1/Thread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread2 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject2.getInstance().hashCode() + " " + MyObject2.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject1 {
7 | private static MyObject1 myObject;
8 |
9 | private MyObject1() {
10 | }
11 |
12 | synchronized public static MyObject1 getInstance() {
13 |
14 | try {
15 | if (myObject == null) {
16 | Thread.sleep(3000);//模拟创建对象前的坐一些准备
17 | myObject = new MyObject1();
18 | }
19 | } catch (InterruptedException e) {
20 | e.printStackTrace();
21 | }
22 | return myObject;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject2 {
7 | private static MyObject2 myObject;
8 |
9 | private MyObject2() {
10 | }
11 |
12 | public static MyObject2 getInstance() {
13 |
14 | try {
15 | //此写法和方法前加synchronized一样效率低下,全部代码被上锁
16 | synchronized (MyObject2.class) {
17 | if (myObject == null) {
18 | Thread.sleep(3000);//模拟创建对象前的坐一些准备
19 | myObject = new MyObject2();
20 | }
21 | }
22 | } catch (InterruptedException e) {
23 | e.printStackTrace();
24 | }
25 | return myObject;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject3 {
7 | private static MyObject3 myObject;
8 |
9 | private MyObject3() {
10 | }
11 |
12 | public static MyObject3 getInstance() {
13 |
14 | try {
15 | if (myObject == null) {
16 | Thread.sleep(3000);//模拟创建对象前的坐一些准备
17 | //虽然部分代码被上锁,但还是有非线程安全问题
18 | synchronized (MyObject3.class) {
19 | myObject = new MyObject3();
20 | }
21 | }
22 | } catch (InterruptedException e) {
23 | e.printStackTrace();
24 | }
25 | return myObject;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/MyObject4.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject4 {
7 | private static MyObject4 myObject;
8 |
9 | private MyObject4() {
10 | }
11 |
12 | public static MyObject4 getInstance() {
13 | //双检查锁机制
14 | try {
15 | if (myObject == null) {
16 | Thread.sleep(3000);//模拟创建对象前的坐一些准备
17 | synchronized (MyObject4.class) {
18 | if (myObject == null) {
19 | myObject = new MyObject4();
20 | }
21 | }
22 | }
23 | } catch (InterruptedException e) {
24 | e.printStackTrace();
25 | }
26 | return myObject;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * p266
9 | * 延迟加载/“懒汉模式”解决方案
10 | * 声明synchronized关键字,整个方法上锁
11 | * 效率低下,下一个线程想取得对象,须等上一个线程释放锁
12 | */
13 | public class Run2_singleton1 {
14 | public static void main(String[] args) {
15 | Thread1 t1 = new Thread1();
16 | Thread1 t2 = new Thread1();
17 | Thread1 t3 = new Thread1();
18 | t1.start();
19 | t2.start();
20 | t3.start();
21 | }
22 | }
23 |
24 |
25 | /*
26 | 输出:
27 | 872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139
28 | 872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139
29 | 872395065 com.brianway.learning.java.multithread.singleton.example2.MyObject1@33ffb139
30 |
31 |
32 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * p267
9 | * 延迟加载/“懒汉模式”解决方案
10 | * 声明synchronized关键字,同步代码块
11 | * 效率低下
12 | */
13 | public class Run2_singleton2 {
14 | public static void main(String[] args) {
15 | Thread2 t1 = new Thread2();
16 | Thread2 t2 = new Thread2();
17 | Thread2 t3 = new Thread2();
18 | t1.start();
19 | t2.start();
20 | t3.start();
21 | }
22 | }
23 |
24 |
25 | /*
26 | 输出:
27 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6
28 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6
29 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject2@3a1a7da6
30 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * p269
9 | * 延迟加载/“懒汉模式”解决方案
10 | * 声明synchronized关键字,部分代码上锁
11 | * 会出问题
12 | */
13 | public class Run2_singleton3 {
14 | public static void main(String[] args) {
15 | Thread3 t1 = new Thread3();
16 | Thread3 t2 = new Thread3();
17 | Thread3 t3 = new Thread3();
18 | t1.start();
19 | t2.start();
20 | t3.start();
21 | }
22 | }
23 |
24 |
25 | /*
26 | 输出:
27 | 541962297 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba
28 | 974814630 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba
29 | 61956794 com.brianway.learning.java.multithread.singleton.example2.MyObject3@3b162ba
30 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Run2_singleton4.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * p270
9 | * 延迟加载/“懒汉模式”解决方案
10 | * DCL双检查锁机制
11 | */
12 | public class Run2_singleton4 {
13 | public static void main(String[] args) {
14 | Thread4 t1 = new Thread4();
15 | Thread4 t2 = new Thread4();
16 | Thread4 t3 = new Thread4();
17 | t1.start();
18 | t2.start();
19 | t3.start();
20 | }
21 | }
22 |
23 |
24 | /*
25 | 输出:
26 | 2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037
27 | 2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037
28 | 2110701623 com.brianway.learning.java.multithread.singleton.example2.MyObject4@7dcec037
29 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread1 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject1.getInstance().hashCode() + " " + MyObject1.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread2 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject2.getInstance().hashCode() + " " + MyObject2.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread3 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject3.getInstance().hashCode() + " " + MyObject3.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example2/Thread4.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread4 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject4.getInstance().hashCode() + " " + MyObject4.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject1 {
7 | private static class MyObjectHandler {
8 | private static MyObject1 myObject = new MyObject1();
9 | }
10 |
11 | private MyObject1() {
12 | }
13 |
14 | synchronized public static MyObject1 getInstance() {
15 | return MyObjectHandler.myObject;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | import java.io.Serializable;
4 |
5 | /**
6 | * Created by Brian on 2016/4/16.
7 | */
8 | public class MyObject2 implements Serializable {
9 | private static class MyObjectHandler {
10 | private static final MyObject2 myObject = new MyObject2();
11 | }
12 |
13 | private MyObject2() {
14 | }
15 |
16 | synchronized public static MyObject2 getInstance() {
17 | return MyObjectHandler.myObject;
18 | }
19 |
20 | protected Object readResolve() {
21 | System.out.println("调用了readResolve方法");
22 | return MyObjectHandler.myObject;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject3 {
7 |
8 | private static MyObject3 instance = null;
9 |
10 | private MyObject3() {
11 | }
12 |
13 | static {
14 | instance = new MyObject3();
15 | }
16 |
17 | public static MyObject3 getInstance() {
18 | return instance;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject4.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public enum MyObject4 {
7 | ObjectFactory;
8 | private Object object;
9 |
10 | private MyObject4() {
11 | try {
12 | Thread.sleep(3000);//模拟初始化
13 | object = new Object();
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 |
19 | public Object getObject() {
20 | return object;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/MyObject5.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class MyObject5 {
7 | public enum MyEnumSingleton {
8 | ObjectFactory;
9 | private Object object;
10 |
11 | private MyEnumSingleton() {
12 | try {
13 | Thread.sleep(3000);//模拟初始化
14 | object = new Object();
15 | } catch (InterruptedException e) {
16 | e.printStackTrace();
17 | }
18 | }
19 |
20 | public Object getObject() {
21 | return object;
22 | }
23 | }
24 |
25 | public static Object getObject() {
26 | return MyEnumSingleton.ObjectFactory.getObject();
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Run3_singleton1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 |
7 | /**
8 | * p272
9 | * 使用静态内置类实现单例模式
10 | */
11 | public class Run3_singleton1 {
12 | public static void main(String[] args) {
13 | Thread1 t1 = new Thread1();
14 | Thread1 t2 = new Thread1();
15 | Thread1 t3 = new Thread1();
16 | t1.start();
17 | t2.start();
18 | t3.start();
19 | }
20 | }
21 |
22 |
23 | /*
24 | 输出:
25 | 418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c
26 | 418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c
27 | 418579292 com.brianway.learning.java.multithread.singleton.example3.MyObject1@18f3035c
28 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread1 extends Thread {
7 | @Override
8 | public void run() {
9 | System.out.println(MyObject1.getInstance().hashCode() + " " + MyObject1.getInstance());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread3 extends Thread {
7 | @Override
8 | public void run() {
9 | for (int i = 0; i < 5; i++) {
10 | System.out.println(MyObject3.getInstance().hashCode() + " " + MyObject3.getInstance());
11 | }
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread4.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread4 extends Thread {
7 | @Override
8 | public void run() {
9 | for (int i = 0; i < 5; i++) {
10 | System.out.println(MyObject4.ObjectFactory.getObject().hashCode() + " " + MyObject4.ObjectFactory.getObject());
11 | }
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/singleton/example3/Thread5.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.singleton.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/16.
5 | */
6 | public class Thread5 extends Thread {
7 | @Override
8 | public void run() {
9 | for (int i = 0; i < 5; i++) {
10 | System.out.println(MyObject5.getObject().hashCode() + " " + MyObject5.getObject());
11 | }
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/MyService.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class MyService {
7 | synchronized static public void serviveMethod() {
8 | try {
9 | System.out.println(Thread.currentThread().getName() + " 进入了业务方法");
10 | Thread.sleep(10000);
11 | } catch (InterruptedException e) {
12 | e.printStackTrace();
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | /**
8 | * P282
9 | * 验证TIMED_WAITING
10 | */
11 | public class Run1_state2 {
12 | public static void main(String[] args) {
13 | try {
14 | Thread2 t = new Thread2();
15 | t.start();
16 | Thread.sleep(1000);
17 | System.out.println("main方法中的状态:" + t.getState() + " of " + t.getName());
18 | } catch (InterruptedException e) {
19 | e.printStackTrace();
20 | }
21 | }
22 | }
23 |
24 |
25 | /*
26 | 输出:
27 | begin sleep,run方法中的状态:RUNNABLE of Thread-0
28 | begin sleep,run方法中的状态:RUNNABLE of Thread-0
29 | main方法中的状态:TIMED_WAITING of Thread-0
30 | end sleep,run方法中的状态:RUNNABLE of Thread-0
31 | end sleep,run方法中的状态:RUNNABLE of Thread-0
32 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Run1_state3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | /**
8 | * P283
9 | * 验证BLOCKED
10 | */
11 | public class Run1_state3 {
12 | public static void main(String[] args) {
13 | try {
14 | Thread3 t1 = new Thread3();
15 | t1.setName("a");
16 | t1.start();
17 | Thread3 t2 = new Thread3();
18 | t2.setName("b");
19 | t2.start();
20 | Thread.sleep(1000);
21 | System.out.println("main方法中的t2状态:" + t2.getState());
22 | } catch (InterruptedException e) {
23 | e.printStackTrace();
24 | }
25 |
26 | }
27 | }
28 |
29 |
30 | /*
31 | 输出:
32 | a 进入了业务方法
33 | main方法中的t2状态:BLOCKED
34 | b 进入了业务方法
35 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class Thread1 extends Thread {
7 | public Thread1() {
8 | System.out.println("构造方法中的状态:" + this.getState() + " of " + this.getName());
9 | System.out.println("构造方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName());
10 | }
11 |
12 | @Override
13 | public void run() {
14 | System.out.println("run方法中的状态:" + this.getState() + " of " + this.getName());
15 | System.out.println("run方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName());
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class Thread2 extends Thread {
7 |
8 | @Override
9 | public void run() {
10 | try {
11 | System.out.println("begin sleep,run方法中的状态:" + this.getState() + " of " + this.getName());
12 | System.out.println("begin sleep,run方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName());
13 | Thread.sleep(10000);
14 | System.out.println("end sleep,run方法中的状态:" + this.getState() + " of " + this.getName());
15 | System.out.println("end sleep,run方法中的状态:" + Thread.currentThread().getState() + " of " + Thread.currentThread().getName());
16 | } catch (InterruptedException e) {
17 | e.printStackTrace();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example1/Thread3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class Thread3 extends Thread {
7 |
8 | @Override
9 | public void run() {
10 | MyService.serviveMethod();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_groupAddThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | /**
8 | * P286
9 | * 线程对象关联线程组,一级关联
10 | */
11 | public class Run2_groupAddThread {
12 | public static void main(String[] args) {
13 | ThreadA a = new ThreadA();
14 | ThreadB b = new ThreadB();
15 | ThreadGroup group = new ThreadGroup("Brian's group");
16 | Thread athread = new Thread(group, a);
17 | Thread bthread = new Thread(group, b);
18 | athread.start();
19 | bthread.start();
20 | System.out.println("活动的线程数为:" + group.activeCount());
21 | System.out.println("线程组的名称为:" + group.getName());
22 | }
23 | }
24 |
25 | /*
26 | 输出:
27 | 活动的线程数为:2
28 | ThreadName = Thread-3
29 | ThreadName = Thread-2
30 | 线程组的名称为:Brian's group
31 | ThreadName = Thread-2
32 | ThreadName = Thread-3
33 | ThreadName = Thread-2
34 | ThreadName = Thread-3
35 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/Run2_threadRunSyn.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | /**
8 | * P291
9 | * 使线程具有有序性
10 | */
11 | public class Run2_threadRunSyn {
12 | public static void main(String[] args) {
13 | Object lock = new Object();
14 | MyThread a = new MyThread(lock, "A", 1);
15 | MyThread b = new MyThread(lock, "B", 2);
16 | MyThread c = new MyThread(lock, "C", 0);
17 | a.start();
18 | b.start();
19 | c.start();
20 | }
21 | }
22 |
23 | /*
24 | 输出:
25 | ThreadName=Thread-0 runCount = 1 A
26 | ThreadName=Thread-1 runCount = 2 B
27 | ThreadName=Thread-2 runCount = 3 C
28 | ThreadName=Thread-0 runCount = 4 A
29 | ThreadName=Thread-1 runCount = 5 B
30 | ThreadName=Thread-2 runCount = 6 C
31 | ThreadName=Thread-0 runCount = 7 A
32 | ThreadName=Thread-1 runCount = 8 B
33 | ThreadName=Thread-2 runCount = 9 C
34 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class ThreadA extends Thread {
7 | @Override
8 | public void run() {
9 | try {
10 | while (!Thread.currentThread().isInterrupted()) {
11 | System.out.println("ThreadName = " + Thread.currentThread().getName());
12 | Thread.sleep(3000);
13 | }
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example2/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class ThreadB extends Thread {
7 | @Override
8 | public void run() {
9 | try {
10 | while (!Thread.currentThread().isInterrupted()) {
11 | System.out.println("ThreadName = " + Thread.currentThread().getName());
12 | Thread.sleep(3000);
13 | }
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/DateTools1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example3;
2 |
3 | import java.text.ParseException;
4 | import java.text.SimpleDateFormat;
5 | import java.util.Date;
6 |
7 | /**
8 | * Created by Brian on 2016/4/17.
9 | */
10 | public class DateTools1 {
11 | public static Date parse(String formatPattern, String dateString) throws ParseException {
12 | return new SimpleDateFormat(formatPattern).parse(dateString);
13 | }
14 |
15 | public static String format(String formatPattern, Date date) {
16 | return new SimpleDateFormat(formatPattern).format(date).toString();
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example3/DateTools2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example3;
2 |
3 | import java.text.SimpleDateFormat;
4 |
5 | /**
6 | * Created by Brian on 2016/4/17.
7 | */
8 | public class DateTools2 {
9 | private static ThreadLocal tl = new ThreadLocal();
10 |
11 | public static SimpleDateFormat getSimpleDateFormat(String datePattern) {
12 | SimpleDateFormat sdf = null;
13 | sdf = tl.get();
14 | if (sdf == null) {
15 | sdf = new SimpleDateFormat(datePattern);
16 | tl.set(sdf);
17 | }
18 | return sdf;
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Run4_threadCreateException.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example4;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | /**
8 | * P297
9 | * 线程中出现异常
10 | */
11 | public class Run4_threadCreateException {
12 | public static void main(String[] args) {
13 | Thread1 t = new Thread1();
14 | t.start();
15 | }
16 | }
17 |
18 | /*
19 | 输出:
20 | Exception in thread "Thread-0" java.lang.NullPointerException
21 | at com.brianway.learning.java.multithread.supplement.example4.Thread1.run(Thread1.java:10)
22 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example4/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example4;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class Thread1 extends Thread {
7 | @Override
8 | public void run() {
9 | String username = null;
10 | System.out.println(username.hashCode());
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Run5_threadGroup1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | /**
8 | * p299
9 | * 线程组内处理异常
10 | */
11 | public class Run5_threadGroup1 {
12 | public static void main(String[] args) {
13 | ThreadGroup group = new ThreadGroup("Brian's group");
14 | Thread1[] threads = new Thread1[10];
15 | for (int i = 0; i < threads.length; i++) {
16 | threads[i] = new Thread1(group, "线程" + (i + 1), "1");
17 | threads[i].start();
18 | }
19 | Thread1 newT = new Thread1(group, "线程报错", "a");
20 | newT.start();
21 | }
22 | }
23 |
24 | /*
25 | 一个线程异常不会停止组内其他线程
26 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class Thread1 extends Thread {
7 | private String num;
8 |
9 | public Thread1(ThreadGroup group, String name, String num) {
10 | super(group, name);
11 | this.num = num;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | int numInt = Integer.parseInt(num);
17 | while (true) {
18 | System.out.println("死循环中:" + Thread.currentThread().getName());
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/Thread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class Thread2 extends Thread {
7 | private String num;
8 |
9 | public Thread2(ThreadGroup group, String name, String num) {
10 | super(group, name);
11 | this.num = num;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | int numInt = Integer.parseInt(num);
17 | while (this.isInterrupted() == false) {
18 | System.out.println("死循环中:" + Thread.currentThread().getName());
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example5/ThreadGroup2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class ThreadGroup2 extends ThreadGroup {
7 |
8 | public ThreadGroup2(String name) {
9 | super(name);
10 | }
11 |
12 | @Override
13 | public void uncaughtException(Thread t, Throwable e) {
14 | super.uncaughtException(t, e);
15 | this.interrupt();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/MyThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class MyThread extends Thread {
7 | private String num = "a";
8 |
9 | public MyThread() {
10 | }
11 |
12 | public MyThread(MyThreadGroup group, String name) {
13 | super(group, name);
14 | }
15 |
16 | @Override
17 | public void run() {
18 | int numInt = Integer.parseInt(num);
19 | System.out.println("在线程中打印:" + (numInt + 1));
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/MyThreadGroup.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 | public class MyThreadGroup extends java.lang.ThreadGroup {
7 |
8 | public MyThreadGroup(String name) {
9 | super(name);
10 | }
11 |
12 | @Override
13 | public void uncaughtException(Thread t, Throwable e) {
14 | super.uncaughtException(t, e);
15 | System.out.println("线程组的异常处理");
16 | e.printStackTrace();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/ObjectUncaughtExceptionHandler.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | import java.lang.Thread.UncaughtExceptionHandler;
8 |
9 | public class ObjectUncaughtExceptionHandler implements UncaughtExceptionHandler {
10 | public void uncaughtException(Thread t, Throwable e) {
11 | System.out.println("对象的异常处理");
12 | e.printStackTrace();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/supplement/example6/StateUncaughtExceptionHandler.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.supplement.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/17.
5 | */
6 |
7 | import java.lang.Thread.UncaughtExceptionHandler;
8 |
9 | public class StateUncaughtExceptionHandler implements UncaughtExceptionHandler {
10 | public void uncaughtException(Thread t, Throwable e) {
11 | System.out.println("静态的异常处理");
12 | e.printStackTrace();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/HasLocalNum.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 |
7 | public class HasLocalNum {
8 | public void addI(String username) {
9 | try {
10 | int num = 0;
11 | if (username.equals("a")) {
12 | num = 100;
13 | System.out.println("a set over");
14 | Thread.sleep(1000);
15 |
16 | } else {
17 | num = 200;
18 | System.out.println("b set over");
19 | }
20 | System.out.println(username + " num= " + num);
21 | } catch (InterruptedException e) {
22 | e.printStackTrace();
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/Run1_local.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 |
7 | /**
8 | * P53例子
9 | * 方法内局部变量则不存在“非线程安全”问题
10 | */
11 |
12 | public class Run1_local {
13 | public static void main(String[] args) {
14 | HasLocalNum numRef = new HasLocalNum();
15 | ThreadA threadA = new ThreadA(numRef);
16 | threadA.start();
17 | ThreadB threadB = new ThreadB(numRef);
18 | threadB.start();
19 | }
20 | }
21 |
22 |
23 | /*
24 | 输出:
25 | a set over
26 | b set over
27 | b num= 200
28 | a num= 100
29 |
30 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 | public class ThreadA extends Thread {
7 | private HasLocalNum numRef;
8 |
9 | public ThreadA(HasLocalNum numRef) {
10 | super();
11 | this.numRef = numRef;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | numRef.addI("a");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example1/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example1;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 | public class ThreadB extends Thread {
7 | private HasLocalNum numRef;
8 |
9 | public ThreadB(HasLocalNum numRef) {
10 | super();
11 | this.numRef = numRef;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | numRef.addI("b");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synMoreObjectStaticOneLock.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example10;
2 |
3 | /**
4 | * Created by brian on 2016/4/13.
5 | */
6 |
7 | /**
8 | * P100
9 | * Class锁可以对类的所有对象实例起作用
10 | */
11 | public class Run10_synMoreObjectStaticOneLock {
12 | public static void main(String[] args) {
13 | Service service1 = new Service();
14 | Service service2 = new Service();
15 |
16 | ThreadA a = new ThreadA(service1);
17 | a.setName("A");
18 | a.start();
19 | ThreadB b = new ThreadB(service2);
20 | b.setName("B");
21 | b.start();
22 |
23 | }
24 | }
25 |
26 | /*
27 | 输出:
28 | 线程名:A 在 1460479094611进入printA
29 | 线程名:A 在 1460479097611离开printA
30 | 线程名:B 在 1460479097611进入printB
31 | 线程名:B 在 1460479097611离开printB
32 | */
33 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/Run10_synTwoLock.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example10;
2 |
3 | /**
4 | * Created by brian on 2016/4/13.
5 | */
6 |
7 | /**
8 | * P97
9 | * 验证synchronized关键字加载static静态方法和加到非静态方法不是同一个锁
10 | * 一个是Class类上锁,一个是对象上锁
11 | */
12 | public class Run10_synTwoLock {
13 | public static void main(String[] args) {
14 | Service service = new Service();
15 |
16 | ThreadA a = new ThreadA(service);
17 | a.setName("A");
18 | a.start();
19 | ThreadB b = new ThreadB(service);
20 | b.setName("B");
21 | b.start();
22 | ThreadC c = new ThreadC(service);
23 | c.setName("C");
24 | c.start();
25 | }
26 | }
27 |
28 | /*
29 | 输出:
30 | 线程名:A 在 1460478479803进入printA
31 | 线程名:C 在 1460478479808进入printC
32 | 线程名:C 在 1460478479808离开printC
33 | 线程名:A 在 1460478482804离开printA
34 | 线程名:B 在 1460478482804进入printB
35 | 线程名:B 在 1460478482804离开printB
36 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example10;
2 |
3 | /**
4 | * Created by brian on 2016/4/13.
5 | */
6 | public class ThreadA extends Thread {
7 | private Service service;
8 |
9 | public ThreadA(Service service) {
10 | super();
11 | this.service = service;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | service.printA();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example10;
2 |
3 | /**
4 | * Created by brian on 2016/4/13.
5 | */
6 | public class ThreadB extends Thread {
7 | private Service service;
8 |
9 | public ThreadB(Service service) {
10 | super();
11 | this.service = service;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | service.printB();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example10/ThreadC.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example10;
2 |
3 | /**
4 | * Created by brian on 2016/4/13.
5 | */
6 | public class ThreadC extends Thread {
7 | private Service service;
8 |
9 | public ThreadC(Service service) {
10 | super();
11 | this.service = service;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | service.printC();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 |
7 | /**
8 | * P102
9 | * String作为锁对象
10 | * 常量池->同一锁
11 | */
12 | public class Run11_StringAndSyn {
13 | public static void main(String[] args) {
14 | ServiceA serviceA = new ServiceA();
15 | ThreadA a = new ThreadA(serviceA);
16 | a.setName("A");
17 | a.start();
18 | ThreadA b = new ThreadA(serviceA);
19 | b.setName("B");
20 | b.start();
21 | }
22 | }
23 |
24 |
25 | /*
26 | 输出:
27 | A
28 | A
29 | A
30 | A
31 | A
32 | A
33 | A
34 | A
35 |
36 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/Run11_StringAndSyn2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 |
7 | /**
8 | * P104
9 | * 不使用String作为锁对象
10 | */
11 | public class Run11_StringAndSyn2 {
12 | public static void main(String[] args) {
13 | ServiceB serviceB = new ServiceB();
14 | ThreadB a = new ThreadB(serviceB);
15 | a.setName("A");
16 | a.start();
17 | ThreadB b = new ThreadB(serviceB);
18 | b.setName("B");
19 | b.start();
20 | }
21 | }
22 |
23 |
24 | /*
25 | 输出:
26 | A
27 | B
28 | B
29 | A
30 | A
31 | B
32 | A
33 | B
34 | A
35 | B
36 | B
37 | A
38 | A
39 | B
40 |
41 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class ServiceA {
7 | public static void print(String stringParam) {
8 | try {
9 | synchronized (stringParam) {
10 | while (true) {
11 | System.out.println(Thread.currentThread().getName());
12 | Thread.sleep(1000);
13 | }
14 | }
15 | } catch (InterruptedException e) {
16 | e.printStackTrace();
17 | }
18 |
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ServiceB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class ServiceB {
7 | public static void print(Object object) {
8 | try {
9 | synchronized (object) {
10 | while (true) {
11 | System.out.println(Thread.currentThread().getName());
12 | Thread.sleep(500);
13 | }
14 | }
15 | } catch (InterruptedException e) {
16 | e.printStackTrace();
17 | }
18 |
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class ThreadA extends Thread {
7 | ServiceA serviceA;
8 |
9 | public ThreadA(ServiceA serviceA) {
10 | super();
11 | this.serviceA = serviceA;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | serviceA.print("123");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example11/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example11;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class ThreadB extends Thread {
7 | ServiceB serviceB;
8 |
9 | public ThreadB(ServiceB serviceB) {
10 | super();
11 | this.serviceB = serviceB;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | serviceB.print(new Object());
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example14/Service.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example14;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class Service {
7 | private String lock = "123";
8 |
9 | public void testMethod() {
10 | try {
11 | synchronized (lock) {
12 | System.out.println(Thread.currentThread().getName() + " begin " + System.currentTimeMillis());
13 | lock = "456";
14 | Thread.sleep(2000);
15 | System.out.println(Thread.currentThread().getName() + " end " + System.currentTimeMillis());
16 | }
17 |
18 | } catch (InterruptedException e) {
19 | e.printStackTrace();
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_synchronized.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 |
7 | /**
8 | * P130
9 | * synchronized代码块有volatile同步的功能
10 | */
11 | public class Run15_synchronized {
12 | public static void main(String[] args) {
13 | try {
14 | RunThread2 t = new RunThread2();
15 | t.start();
16 | Thread.sleep(1000);
17 | t.setRunning(false);
18 | System.out.println("已经赋值为false");
19 | } catch (InterruptedException e) {
20 | e.printStackTrace();
21 | }
22 | }
23 | }
24 |
25 |
26 | /*
27 | 输出:
28 | 进入run了
29 | 线程被停止了
30 | 已经赋值为false
31 |
32 | -----------------
33 | 注释掉RunThread2类中的synchronized ("any thing"){}
34 | 输出:
35 | 进入run了
36 | 已经赋值为false
37 |
38 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/Run15_volatile.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 |
7 | /**
8 | * P121
9 | * 不使用volatile关键字
10 | * JVM配置 -server(IDEA15.02,jdk1.8,WIN7,64bit不加效果也是的)
11 | */
12 | public class Run15_volatile {
13 | public static void main(String[] args) {
14 | try {
15 | RunThread t = new RunThread();
16 | t.start();
17 | Thread.sleep(1000);
18 | t.setRunning(false);
19 | System.out.println("已经赋值为false");
20 | } catch (InterruptedException e) {
21 | e.printStackTrace();
22 | }
23 | }
24 | }
25 |
26 |
27 | /*
28 | 输出:
29 | 进入run了
30 | 已经赋值为false
31 |
32 | --------------
33 | 加上volatile关键字后
34 | 输出:
35 | 进入run了
36 | 已经赋值为false
37 | 线程被停止了
38 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class RunThread extends Thread {
7 | private boolean isRunning = true;
8 | //volatile private boolean isRunning = true;
9 |
10 | public boolean isRunning() {
11 | return isRunning;
12 | }
13 |
14 | public void setRunning(boolean running) {
15 | isRunning = running;
16 | }
17 |
18 | @Override
19 | public void run() {
20 | System.out.println("进入run了");
21 | while (isRunning == true) {
22 |
23 | }
24 | System.out.println("线程被停止了");
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example15/RunThread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example15;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class RunThread2 extends Thread {
7 | private boolean isRunning = true;
8 |
9 | public boolean isRunning() {
10 | return isRunning;
11 | }
12 |
13 | public void setRunning(boolean running) {
14 | isRunning = running;
15 | }
16 |
17 | @Override
18 | public void run() {
19 | System.out.println("进入run了");
20 | while (isRunning == true) {
21 | synchronized ("any thing") {
22 | }
23 | }
24 | System.out.println("线程被停止了");
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example16/MyThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example16;
2 |
3 | /**
4 | * Created by Brian on 2016/4/13.
5 | */
6 | public class MyThread extends Thread {
7 | volatile public static int count;
8 |
9 | //synchronized
10 | private static void addCount() {
11 | for (int i = 0; i < 100; i++) {
12 | count++;
13 | }
14 | System.out.println("count=" + count);
15 | }
16 |
17 | @Override
18 | public void run() {
19 | addCount();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/HasSelfPrivateNum.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 | public class HasSelfPrivateNum {
7 | private int num = 0;
8 |
9 | synchronized
10 | public void addI(String username) {
11 | try {
12 | if (username.equals("a")) {
13 | num = 100;
14 | System.out.println("a set over");
15 | Thread.sleep(2000);
16 |
17 | } else {
18 | num = 200;
19 | System.out.println("b set over");
20 | }
21 | System.out.println(username + " num= " + num);
22 | } catch (InterruptedException e) {
23 | e.printStackTrace();
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_private01.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 |
7 | /**
8 | * P55
9 | * 实例变量非线程安全
10 | */
11 | public class Run2_private01 {
12 | public static void main(String[] args) {
13 | HasSelfPrivateNum numRef = new HasSelfPrivateNum();
14 | ThreadA threadA = new ThreadA(numRef);
15 | threadA.start();
16 | ThreadB threadB = new ThreadB(numRef);
17 | threadB.start();
18 | }
19 | }
20 |
21 | /*
22 | //synchronized
23 | public void addI(String username)
24 | 输出:
25 | a set over
26 | b set over
27 | b num= 200
28 | a num= 200
29 |
30 | ---------------
31 | HasSelfPrivateNum中addI加synchronized
32 | 输出:(注意顺序)
33 | a set over
34 | a num= 100
35 | b set over
36 | b num= 200
37 |
38 |
39 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/Run2_twoObject.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 |
7 | /**
8 | * P58
9 | * 多个对象多个锁
10 | * 关键字synchronized取得的都是对象锁
11 | * 由于两个对象,所以是两个锁,没有同步问题。运行结果异步
12 | */
13 | public class Run2_twoObject {
14 | public static void main(String[] args) {
15 | HasSelfPrivateNum numRef1 = new HasSelfPrivateNum();
16 | HasSelfPrivateNum numRef2 = new HasSelfPrivateNum();
17 | ThreadA threadA = new ThreadA(numRef1);
18 | threadA.start();
19 | ThreadB threadB = new ThreadB(numRef2);
20 | threadB.start();
21 | }
22 | }
23 |
24 |
25 | /*
26 | synchronized public void addI
27 | 输出:(注意顺序,由于两个对象,所以是两个锁,没有同步问题。运行结果异步)
28 | a set over
29 | b set over
30 | b num= 200
31 | a num= 100
32 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 | public class ThreadA extends Thread {
7 | private HasSelfPrivateNum numRef;
8 |
9 | public ThreadA(HasSelfPrivateNum numRef) {
10 | super();
11 | this.numRef = numRef;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | numRef.addI("a");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example2/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example2;
2 |
3 | /**
4 | * Created by Brian on 2016/4/11.
5 | */
6 | public class ThreadB extends Thread {
7 | private HasSelfPrivateNum numRef;
8 |
9 | public ThreadB(HasSelfPrivateNum numRef) {
10 | super();
11 | this.numRef = numRef;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | numRef.addI("b");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/MyObject.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 |
7 | public class MyObject {
8 | synchronized
9 | public void methodA() {
10 | try {
11 | System.out.println("begin methodA threadName=" + Thread.currentThread().getName());
12 | Thread.sleep(5000);
13 | System.out.println(Thread.currentThread().getName() + " end");
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/Run3_synchronized01.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 |
7 | /**
8 | * P60
9 | * synchronized方法与锁对象
10 | */
11 | public class Run3_synchronized01 {
12 | public static void main(String[] args) {
13 | MyObject object = new MyObject();
14 | ThreadA a = new ThreadA(object);
15 | a.setName("A ");
16 | ThreadB b = new ThreadB(object);
17 | b.setName("B ");
18 | a.start();
19 | b.start();
20 | }
21 | }
22 |
23 | /*
24 | public void methodA()没加synchronized
25 | 输出:
26 | begin methodA threadName=B
27 | begin methodA threadName=A
28 | A end
29 | B end
30 |
31 | -------------------
32 |
33 | public void methodA()加synchronized
34 | 输出:
35 | begin methodA threadName=A
36 | A end
37 | begin methodA threadName=B
38 | B end
39 |
40 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class ThreadA extends Thread {
7 | private MyObject object;
8 |
9 | public ThreadA(MyObject object) {
10 | super();
11 | this.object = object;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | object.methodA();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example3/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example3;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class ThreadB extends Thread {
7 | private MyObject object;
8 |
9 | public ThreadB(MyObject object) {
10 | super();
11 | this.object = object;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | object.methodA();
18 | }
19 | }
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example4;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class ThreadA extends Thread {
7 | private MyObject object;
8 |
9 | public ThreadA(MyObject object) {
10 | super();
11 | this.object = object;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | object.methodA();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example4/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example4;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class ThreadB extends Thread {
7 | private MyObject object;
8 |
9 | public ThreadB(MyObject object) {
10 | super();
11 | this.object = object;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | object.methodB();
18 | }
19 | }
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Main.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Main {
7 | protected int i = 10;
8 |
9 | synchronized public void operateIinMain() {
10 | try {
11 | i--;
12 | System.out.println("main print i=" + i);
13 | Thread.sleep(100);
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Run5_lockRein.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 |
7 | /**
8 | * P67
9 | * synchronized锁重入,支持继承
10 | */
11 | public class Run5_lockRein {
12 | public static void main(String[] args) {
13 | Thread t = new Thread() {
14 | @Override
15 | public void run() {
16 | Sub sub = new Sub();
17 | sub.operateIinSub();
18 | }
19 | };
20 | t.start();
21 |
22 | }
23 |
24 | }
25 |
26 | /*
27 | 输出:
28 | sub print i=9
29 | main print i=8
30 | sub print i=7
31 | main print i=6
32 | sub print i=5
33 | main print i=4
34 | sub print i=3
35 | main print i=2
36 | sub print i=1
37 | main print i=0
38 | */
39 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example5/Sub.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example5;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Sub extends Main {
7 | synchronized public void operateIinSub() {
8 | try {
9 | while (i > 0) {
10 | i--;
11 | System.out.println("sub print i=" + i);
12 | Thread.sleep(100);
13 | this.operateIinMain();
14 | }
15 |
16 | } catch (InterruptedException e) {
17 | e.printStackTrace();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/Service.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Service {
7 | synchronized public void testMethod() {
8 | if (Thread.currentThread().getName().equals("a")) {
9 | System.out.println("ThreadName=" + Thread.currentThread().getName() + " run beginTime=" + System.currentTimeMillis());
10 |
11 | int i = 1;
12 | while (i == 1) {
13 | if (("" + Math.random()).substring(0, 8).equals("0.123456")) {
14 | System.out.println("ThreadName=" + Thread.currentThread().getName() + " run exceptionTime=" + System.currentTimeMillis());
15 | Integer.parseInt("a");
16 | }
17 | }
18 | } else {
19 | System.out.println("Thread b run Time=" + System.currentTimeMillis());
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class ThreadA extends Thread {
7 | private Service service;
8 |
9 | public ThreadA(String name, Service service) {
10 | super(name);
11 | this.service = service;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | service.testMethod();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example6/ThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example6;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class ThreadB extends Thread {
7 | private Service service;
8 |
9 | public ThreadB(String name, Service service) {
10 | super(name);
11 | this.service = service;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | service.testMethod();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Main.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Main {
7 | synchronized public void testMethod() {
8 | try {
9 | System.out.println("threadName= " + Thread.currentThread().getName() + " in main 下一步 sleep begin time =" + System.currentTimeMillis());
10 | Thread.sleep(5000);
11 | System.out.println("threadName= " + Thread.currentThread().getName() + " in main 下一步 sleep end time =" + System.currentTimeMillis());
12 | } catch (InterruptedException e) {
13 | e.printStackTrace();
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/MyThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class MyThread extends Thread {
7 | private Sub sub;
8 |
9 | public MyThread(Sub sub) {
10 | super();
11 | this.sub = sub;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | sub.testMethod();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example7/Sub.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example7;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Sub extends Main {
7 | //synchronized
8 | public void testMethod() {
9 | try {
10 | System.out.println("threadName= " + Thread.currentThread().getName() + " in sub 下一步 sleep begin time =" + System.currentTimeMillis());
11 | Thread.sleep(2000);
12 | System.out.println("threadName= " + Thread.currentThread().getName() + " in sub 下一步 sleep end time =" + System.currentTimeMillis());
13 | super.testMethod();
14 | } catch (InterruptedException e) {
15 | e.printStackTrace();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/CommonUtils.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class CommonUtils {
7 | public static long beginTime1;
8 | public static long endTime1;
9 | public static long beginTime2;
10 | public static long endTime2;
11 | }
12 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class MyThreadA extends Thread {
7 | private TaskA taskA;
8 |
9 | public MyThreadA(TaskA taskA) {
10 | super();
11 | this.taskA = taskA;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | if (this.getName().equals("a")) {
18 | CommonUtils.beginTime1 = System.currentTimeMillis();
19 | taskA.doLongTimeTask();
20 | CommonUtils.endTime1 = System.currentTimeMillis();
21 | } else if (this.getName().equals("b")) {
22 | CommonUtils.beginTime2 = System.currentTimeMillis();
23 | taskA.doLongTimeTask();
24 | CommonUtils.endTime2 = System.currentTimeMillis();
25 | } else {
26 | System.out.println("unexpected name");
27 | }
28 |
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/MyThreadB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class MyThreadB extends Thread {
7 | private TaskB taskB;
8 |
9 | public MyThreadB(TaskB taskB) {
10 | super();
11 | this.taskB = taskB;
12 | }
13 |
14 | @Override
15 | public void run() {
16 | super.run();
17 | if (this.getName().equals("c")) {
18 | CommonUtils.beginTime1 = System.currentTimeMillis();
19 | taskB.doLongTimeTask();
20 | CommonUtils.endTime1 = System.currentTimeMillis();
21 | } else if (this.getName().equals("d")) {
22 | CommonUtils.beginTime2 = System.currentTimeMillis();
23 | taskB.doLongTimeTask();
24 | CommonUtils.endTime2 = System.currentTimeMillis();
25 | } else {
26 | System.out.println("unexpected name");
27 | }
28 |
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example8/TaskA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example8;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class TaskA {
7 | private String getData1;
8 | private String getData2;
9 |
10 | public synchronized void doLongTimeTask() {
11 | try {
12 | System.out.println("begin task");
13 | Thread.sleep(3000);
14 | getData1 = "长时间处理任务后从远程返回的值1 threadName=" + Thread.currentThread().getName();
15 | getData2 = "长时间处理任务后从远程返回的值2 threadName=" + Thread.currentThread().getName();
16 | System.out.println(getData1);
17 | System.out.println(getData2);
18 | System.out.println("end task");
19 | } catch (InterruptedException e) {
20 | e.printStackTrace();
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class MyObject {
7 | }
8 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class MyObject1 extends MyObject {
7 | synchronized public void speedPrintString() {
8 | System.out.println("speedPrintString ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
9 | System.out.println("*******************");
10 | System.out.println("speedPrintString releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyObject2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class MyObject2 extends MyObject {
7 | public void speedPrintString() {
8 | synchronized (this) {
9 | System.out.println("speedPrintString ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
10 | System.out.println("*******************");
11 | System.out.println("speedPrintString releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/MyThread.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class MyThread extends Thread {
7 | private Service service;
8 | private MyObject object;
9 |
10 | public MyThread(Service service, MyObject object) {
11 | super();
12 | this.object = object;
13 | this.service = service;
14 | }
15 |
16 | @Override
17 | public void run() {
18 | super.run();
19 | service.testMethod1(object);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Service.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Service {
7 | public void testMethod1(MyObject object) {
8 | synchronized (object) {
9 | try {
10 | System.out.println("testMethod1 ____getLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
11 | Thread.sleep(2000);
12 | System.out.println("testMethod1 releaseLock time=" + System.currentTimeMillis() + " run ThreadName=" + Thread.currentThread().getName());
13 | } catch (InterruptedException e) {
14 | e.printStackTrace();
15 | }
16 | }
17 |
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Thread1 extends Thread {
7 | private MyObject1 object1;
8 |
9 | public Thread1(MyObject1 object1) {
10 | this.object1 = object1;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | super.run();
16 | object1.speedPrintString();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/synchronize/example9/Thread2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.synchronize.example9;
2 |
3 | /**
4 | * Created by Brian on 2016/4/12.
5 | */
6 | public class Thread2 extends Thread {
7 | private MyObject2 object2;
8 |
9 | public Thread2(MyObject2 object2) {
10 | this.object2 = object2;
11 | }
12 |
13 | @Override
14 | public void run() {
15 | super.run();
16 | object2.speedPrintString();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/MyTask.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example1;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class MyTask extends TimerTask {
10 | @Override
11 | public void run() {
12 | System.out.println("任务执行了,时间为:" + new Date());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example1;
2 |
3 | import java.util.Calendar;
4 | import java.util.Date;
5 | import java.util.Timer;
6 |
7 | /**
8 | * Created by Brian on 2016/4/15.
9 | */
10 |
11 | /**
12 | * P242
13 | * schedule(TimerTask task, Date time)测试,在未来执行的效果
14 | * Timer的构造方法会新启一个线程,且非守护线程
15 | */
16 | public class Run1_timer1 {
17 | public static void main(String[] args) {
18 | System.out.println("当前时间为:" + new Date());
19 | Calendar calendar = Calendar.getInstance();
20 | calendar.add(Calendar.SECOND, 5);
21 | Date runDate = calendar.getTime();
22 |
23 | MyTask task = new MyTask();
24 | Timer timer = new Timer();
25 | timer.schedule(task, runDate);
26 | }
27 | }
28 |
29 | /*
30 | 输出:
31 | 当前时间为:Fri Apr 15 22:10:14 CST 2016
32 | 任务执行了,时间为:Fri Apr 15 22:10:19 CST 2016
33 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example1;
2 |
3 | import java.util.Calendar;
4 | import java.util.Date;
5 | import java.util.Timer;
6 |
7 | /**
8 | * Created by Brian on 2016/4/15.
9 | */
10 |
11 | /**
12 | * P243
13 | * schedule(TimerTask task, Date time)测试,在未来执行的效果
14 | * Timer的构造方法会新启一个守护线程
15 | * 迅速结束,task任务未被执行
16 | */
17 | public class Run1_timer2 {
18 | public static void main(String[] args) {
19 | System.out.println("当前时间为:" + new Date());
20 | Calendar calendar = Calendar.getInstance();
21 | calendar.add(Calendar.SECOND, 5);
22 | Date runDate = calendar.getTime();
23 |
24 | MyTask task = new MyTask();
25 | Timer timer = new Timer(true);//守护线程
26 | timer.schedule(task, runDate);
27 | }
28 | }
29 |
30 | /*
31 | 输出:
32 | 当前时间为:Fri Apr 15 22:12:28 CST 2016
33 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/Run1_timer3.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example1;
2 |
3 | import java.util.Calendar;
4 | import java.util.Date;
5 | import java.util.Timer;
6 |
7 | /**
8 | * Created by Brian on 2016/4/15.
9 | */
10 |
11 | /**
12 | * P244
13 | * schedule(TimerTask task, Date time)测试,提前运行的效果
14 | */
15 | public class Run1_timer3 {
16 | public static void main(String[] args) {
17 | System.out.println("当前时间为:" + new Date());
18 | Calendar calendar = Calendar.getInstance();
19 | calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 10);
20 | Date runDate = calendar.getTime();
21 | System.out.println("计划时间为:" + runDate);
22 | MyTask task = new MyTask();
23 | Timer timer = new Timer();
24 | timer.schedule(task, runDate);
25 | }
26 | }
27 |
28 | /*
29 | 输出:
30 | 当前时间为:Fri Apr 15 22:15:40 CST 2016
31 | 计划时间为:Fri Apr 15 22:15:30 CST 2016
32 | 任务执行了,时间为:Fri Apr 15 22:15:40 CST 2016
33 | */
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example1;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class TaskA extends TimerTask {
10 | @Override
11 | public void run() {
12 | try {
13 | System.out.println("A begin timer=" + new Date());
14 | Thread.sleep(10000);
15 | System.out.println("A end timer=" + new Date());
16 | } catch (InterruptedException e) {
17 | e.printStackTrace();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example1/TaskB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example1;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class TaskB extends TimerTask {
10 | @Override
11 | public void run() {
12 | System.out.println("B begin timer=" + new Date());
13 | System.out.println("B end timer=" + new Date());
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/MyTask.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example2;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class MyTask extends TimerTask {
10 | @Override
11 | public void run() {
12 | System.out.println("任务执行了,时间为:" + new Date());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example2/TaskA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example2;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class TaskA extends TimerTask {
10 | @Override
11 | public void run() {
12 | try {
13 | System.out.println("A begin timer=" + new Date());
14 | Thread.sleep(5000);
15 | System.out.println("A end timer=" + new Date());
16 | } catch (InterruptedException e) {
17 | e.printStackTrace();
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/MyTask.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example3;
2 |
3 | import java.util.TimerTask;
4 |
5 | /**
6 | * Created by brian on 2016/4/15.
7 | */
8 | public class MyTask extends TimerTask {
9 | private int i;
10 |
11 | public MyTask(int i) {
12 | this.i = i;
13 | }
14 |
15 | @Override
16 | public void run() {
17 | System.out.println("第" + i + "次没有被cancel取消");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example3;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class TaskA extends TimerTask {
10 | @Override
11 | public void run() {
12 | System.out.println("A run timer=" + new Date());
13 | this.cancel();
14 | System.out.println("A任务自己移除自己");
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskA2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example3;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class TaskA2 extends TimerTask {
10 | @Override
11 | public void run() {
12 | System.out.println("A run timer=" + new Date());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example3;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by brian on 2016/4/15.
8 | */
9 | public class TaskB extends TimerTask {
10 | @Override
11 | public void run() {
12 | System.out.println("B run timer=" + new Date());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example3/TaskB2.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example3;
2 |
3 | import java.util.Date;
4 | import java.util.TimerTask;
5 |
6 | /**
7 | * Created by Brian on 2016/4/15.
8 | */
9 | public class TaskB2 extends TimerTask {
10 | @Override
11 | public void run() {
12 | System.out.println("B run timer=" + new Date());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-multithread/src/main/java/com/brianway/learning/java/multithread/timer/example4/Run4_schedule1.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java.multithread.timer.example4;
2 |
3 | /**
4 | * Created by brian on 2016/4/15.
5 | */
6 |
7 | import java.util.Date;
8 | import java.util.Timer;
9 | import java.util.TimerTask;
10 |
11 | /**
12 | * P252
13 | * schedule(TimerTask task, long delay)方法
14 | */
15 | public class Run4_schedule1 {
16 | static public class MyTask extends TimerTask {
17 | @Override
18 | public void run() {
19 | System.out.println("运行了!时间为:" + new Date());
20 | }
21 | }
22 |
23 | public static void main(String[] args) {
24 | MyTask task = new MyTask();
25 | Timer timer = new Timer();
26 | System.out.println("当前时间:" + new Date());
27 | timer.schedule(task, 7000);
28 | }
29 | }
30 |
31 | /*
32 | 输出:
33 | 当前时间:Sat Apr 16 00:00:22 CST 2016
34 | 运行了!时间为:Sat Apr 16 00:00:29 CST 2016
35 |
36 | */
--------------------------------------------------------------------------------
/java8/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | java-learning
7 | com.brianway.learning.java
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | java8
13 |
14 |
15 |
16 | junit
17 | junit
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/Ambiguous.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective;
2 |
3 | /**
4 | * 默认方法解决冲突
5 | */
6 | public class Ambiguous {
7 |
8 | public static void main(String... args) {
9 | new C().hello();
10 | }
11 |
12 | interface A {
13 | default void hello() {
14 | System.out.println("Hello from A");
15 | }
16 | }
17 |
18 | interface B {
19 | default void hello() {
20 | System.out.println("Hello from B");
21 | }
22 | }
23 |
24 | static class C implements B, A {
25 | public void hello() {
26 | A.super.hello();// Java 8 引入的新语法: X.super.m(...)
27 | // 其中 X 为希望调用 m 方法所在的父接口
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/async/AsyncShopClient.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective.async;
2 |
3 | import java.util.concurrent.Future;
4 |
5 | /**
6 | * 演示错误处理
7 | */
8 | public class AsyncShopClient {
9 |
10 | public static void main(String[] args) {
11 | AsyncShop shop = new AsyncShop("BestShop");
12 | long start = System.nanoTime();
13 | Future futurePrice = shop.getPrice("myPhone");
14 | long incocationTime = ((System.nanoTime() - start) / 1_000_000);
15 | System.out.println("Invocation returned after " + incocationTime + " msecs");
16 | try {
17 | System.out.println("Price is " + futurePrice.get());
18 | } catch (Exception e) {
19 | throw new RuntimeException(e);
20 | }
21 | long retrivalTime = ((System.nanoTime() - start) / 1_000_000);
22 | System.out.println("Price returned after " + retrivalTime + " msecs");
23 | }
24 | }
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/async/Discount.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective.async;
2 |
3 | import static com.brianway.learning.java8.effective.async.Util.delay;
4 | import static com.brianway.learning.java8.effective.async.Util.format;
5 |
6 | /**
7 | * 折扣类
8 | */
9 | public class Discount {
10 |
11 | public enum Code {
12 | NONE(0),
13 | SILVER(5),
14 | GOLD(10),
15 | PLATINUM(15),
16 | DIAMOND(20);
17 |
18 | private final int percentage;
19 |
20 | Code(int percentage) {
21 | this.percentage = percentage;
22 | }
23 | }
24 |
25 | public static String applyDiscount(Quote quote) {
26 | return quote.getShopName() + " price is " + Discount.apply(quote.getPrice(), quote.getDiscountCode());
27 | }
28 |
29 | private static double apply(double price, Code code) {
30 | delay();
31 | return format(price * (100 - code.percentage) / 100);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/async/ExchangeService.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective.async;
2 |
3 | import static com.brianway.learning.java8.effective.async.Util.delay;
4 |
5 | /**
6 | * 货币兑换类
7 | */
8 | public class ExchangeService {
9 |
10 | public enum Money {
11 | USD(1.0),
12 | EUR(1.35387),
13 | GBP(1.69715),
14 | CAD(.92106),
15 | MXN(.07683);
16 |
17 | private final double rate;
18 |
19 | Money(double rate) {
20 | this.rate = rate;
21 | }
22 | }
23 |
24 | public static double getRate(Money source, Money destination) {
25 | return getRateWithDelay(source, destination);
26 | }
27 |
28 | private static double getRateWithDelay(Money source, Money destination) {
29 | delay();
30 | return destination.rate / source.rate;
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/optional/Car.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective.optional;
2 |
3 | import java.util.Optional;
4 |
5 | public class Car {
6 |
7 | private Optional insurance;
8 |
9 | public Optional getInsurance() {
10 | return insurance;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/optional/Insurance.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective.optional;
2 |
3 | public class Insurance {
4 |
5 | private String name;
6 |
7 | public String getName() {
8 | return name;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/optional/Person.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective.optional;
2 |
3 | import java.util.Optional;
4 |
5 | public class Person {
6 |
7 | private Car car;
8 |
9 | public Optional getCar() {
10 | return Optional.ofNullable(car);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/effective/tech/Peek.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.effective.tech;
2 |
3 | import static java.util.stream.Collectors.toList;
4 |
5 | import java.util.List;
6 | import java.util.stream.Stream;
7 |
8 | /**
9 | * 使用日志调试
10 | */
11 | public class Peek {
12 |
13 | public static void main(String[] args) {
14 |
15 | List result = Stream.of(2, 3, 4, 5)
16 | .peek(x -> System.out.println("taking from stream: " + x))
17 | .map(x -> x + 17)
18 | .peek(x -> System.out.println("after map: " + x))
19 | .filter(x -> x % 2 == 0)
20 | .peek(x -> System.out.println("after filter: " + x))
21 | .limit(3)
22 | .peek(x -> System.out.println("after limit: " + x))
23 | .collect(toList());
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/streamapi/practice/Trader.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.streamapi.practice;
2 |
3 | public class Trader {
4 |
5 | private String name;
6 | private String city;
7 |
8 | public Trader(String n, String c) {
9 | this.name = n;
10 | this.city = c;
11 | }
12 |
13 | public String getName() {
14 | return this.name;
15 | }
16 |
17 | public String getCity() {
18 | return this.city;
19 | }
20 |
21 | public void setCity(String newCity) {
22 | this.city = newCity;
23 | }
24 |
25 | public String toString() {
26 | return "Trader:" + this.name + " in " + this.city;
27 | }
28 | }
--------------------------------------------------------------------------------
/java8/src/main/java/com/brianway/learning/java8/streamapi/practice/Transaction.java:
--------------------------------------------------------------------------------
1 | package com.brianway.learning.java8.streamapi.practice;
2 |
3 | public class Transaction {
4 |
5 | private Trader trader;
6 | private int year;
7 | private int value;
8 |
9 | public Transaction(Trader trader, int year, int value) {
10 | this.trader = trader;
11 | this.year = year;
12 | this.value = value;
13 | }
14 |
15 | public Trader getTrader() {
16 | return this.trader;
17 | }
18 |
19 | public int getYear() {
20 | return this.year;
21 | }
22 |
23 | public int getValue() {
24 | return this.value;
25 | }
26 |
27 | public String toString() {
28 | return "{" + this.trader + ", " +
29 | "year: " + this.year + ", " +
30 | "value:" + this.value + "}";
31 | }
32 | }
--------------------------------------------------------------------------------
/java8/src/main/resources/data-building.txt:
--------------------------------------------------------------------------------
1 | The quick brown fox jumped over the lazy dog
2 | The lazy dog jumped over the quick brown fox
3 |
--------------------------------------------------------------------------------
/java8/src/main/resources/data-lambda.txt:
--------------------------------------------------------------------------------
1 | Java
2 | 8
3 | Lambdas
4 | In
5 | Action
--------------------------------------------------------------------------------