Thursday, October 6, 2011

a java thread doesn't map to an object

Some java developers intuitively think a thread maps to an object in JVM (or kernel), and we can control it by calling methods on it (similar to how we control a JDBC connection or JMS session). For both novice and experienced java developers, it can be hard to unlearn that idea.

java.lang.Thread static methods obviously don't affect any particular "object" [1], since they are static method. java.lang.Thread instance methods do affect the target thread, in limited ways. The stop/suspend/resume methods are direct actions on an an "instance" but are deprecated. The most fundamential programmatic controls on a thread involve locks and wait/notify, which paradoxically never name the threads they affect. Using these constructs demands that we visualize the affected threads as unassociated with any jvm object including the java.lang.Thread instances.

All experienced multi-threading developers eventually get the idea that a thread is not really associated with any object we create in our source code.

Java confuses us by giving us object-oriented thread creation constructs + thread pool. These make us feel threads are just objects. Well, are ebooks real books?

As explained in my blog on [[programmatic control on threads]], a VM thread has its memory structure residing in the stack space, including program counters and per-thread registers. The Thread.java object we create is a JVM heap object having a pointer to the VM thread. This Thread object is unrelated [2] to those objects accessible on the VM thread.

VM thread is basically a stack of open method CALLS. Each non-static method call like m1() has a host object (myAccount for eg) but that host object is UNRELATED[2] to the vm thread. However, myAccount can become problematic to our vm thread due to data corruption if
* m1() read/write myAccount fields
* and other vm threads also have method CALLs that read/write fields of this same myAccount instance.
* In addition, m1() often read/write other shared objects like herAccount, while other threads may also read/write herAccount

It's exactly due to this kind of concurrent access to shared objects (like myAccount) that we end up with locks, wait/notify and all the consistency/liveness issues.

Among vm thread t1, corresponding Thread instance T1, and a regular object U1 on t1, we can say
+ T1 has a pointer to t1, but never to U1
+ t1 has no pointer to T1 or U1. This t1 is not a java object with fields and methods.
+ U1 has no pointer to t1, but the can get a pointer to T1 using Thread.currentThread(). But can it access fields of T1 if you put custom fields into T1? YES. Thread.currentThread() returns the same Thread instance every time.

In conclusion, the Thread.java object is a poor handle on the vm thread. The vm thread is not an object but a call stack. You don't have a good java object (with fields and methods) manipulating the vm thread. Crucially, the method calls on a vm thread often access shared objects, but these objects are unrelated[2] to the vm thread

[1] Actually Thread.sleep does affect the current thread but that's a minor point.
[2] there's no pointer between the vm thread and myAccount. If you know myAccount.m1() is running on a vm thread, myAccount.m1() might simultaneously be running on antoher vm thread too.

No comments:

Total Pageviews

my favorite topics (labels)

_fuxi (302) _misLabel (13) _orig? (3) _rm (2) _vague (2) clarified (58) cpp (39) cpp_const (22) cpp_real (76) cpp/java/c# (101) cppBig4 (54) cppSmartPtr (35) cppSTL (33) cppSTL_itr (27) cppSTL_real (26) cppTemplate (28) creditMkt (14) db (65) db_sybase (43) deepUnder (31) dotnet (20) ECN (27) econ/bank` (36) fin/sys_misc (43) finGreek (34) finReal (45) finRisk (30) finTechDesign (46) finTechMisc (32) finVol (66) FixedIncom (28) fMath (7) fMathOption (33) fMathStoch (67) forex (39) gr8IV_Q (46) GTD_skill (15) GUI_event (30) inMemDB (42) intuit_math (41) intuitFinance (57) javaMisc (68) javaServerSide (13) lambda/delegate (22) marketData (28) math (10) mathStat (55) memIssue (8) memMgmt (66) metaProgram` (6) OO_Design (84) original_content (749) polymorphic/vptr (40) productive (21) ptr/ref (48) py (28) reflect (8) script`/unix (82) socket/stream (39) subquery/join (30) subvert (13) swing/wpf (9) sysProgram` (16) thread (164) thread_CAS (15) thread_cpp (28) Thread* (22) timeSaver (80) transactional (23) tune (24) tuneDB (40) tuneLatency (30) z_ajax (9) z_algoDataStruct (41) z_arch (26) z_arch_job (27) z_automateTest (17) z_autoTrad` (19) z_bestPractice (39) z_bold (83) z_bondMath (35) z_book (18) z_boost (19) z_byRef^Val (32) z_c#GUI (43) z_c#misc (80) z_cast/convert (28) z_container (67) z_cStr/arr (39) z_Favorite* (8) z_FIX (15) z_forex (48) z_fwd_Deal (18) z_gz=job (33) z_gzBig20 (13) z_gzMgr (13) z_gzPain (20) z_gzThreat (19) z_hib (19) z_IDE (52) z_ikm (5) z_IR_misc (36) z_IRS (26) z_javaWeb (28) z_jdbc (10) z_jobFinTech (46) z_jobHunt (20) z_jobRealXp (10) z_jobStrength (15) z_jobUS^asia (27) z_letter (42) z_linq (10) z_memberHid` (11) z_MOM (54) z_nestedClass (5) z_oq (24) z_PCP (12) z_pearl (1) z_php (20) z_prodSupport (7) z_py (31) z_quant (14) z_regex (8) z_rv (38) z_skillist (48) z_slic`Problem (6) z_SOA (14) z_spring (25) z_src_code (8) z_swingMisc (50) z_swingTable (26) z_unpublish (2) z_VBA/Excel (8) z_windoz (17) z_wpfCommand (9)

About Me

New York (Time Square), NY, United States
http://www.linkedin.com/in/tanbin