Thursday, July 28, 2011

object, referent, and reference -- intro to weak reference

see also post on pointer.

-- physical explanation of the 3 jargons
A regular object (say a String "Hi") can be the target of many references
* a regular strong reference String s="Hi";
* another regular strong reference String ss1=s; // remote control duplicated
* a weak ref WeakReference wr1 = new WeakReference(ss1);
* another wak ref wr2 = new WeakReference(s);

1) First, distinguish a regular object "Hi" from a regular strong reference ss1.
* The object "Hi" is a "cookie" made from a "cookie cutter" (ie a class), with instance and static methods defined for it.
** like all objects, this one is created on the heap. Also, think of it as an onion -- see other posts.
** "Hi" is nameless, but with a physical address. The address is crucial to the "pointer" below.

* strong reference ss1 is a "remote control" of type String. See blog post [[an obj ref = a remote control]]
** People don't say it but ss1 is also a real thingy in memory. It can be duplicated like a remote control. It has a name. It's smaller than an object. It can be nullified.
** It can't have methods or fields. But it's completely different from primitive variables.
** method calls duplicate the remote control as an argument. That's why java is known for pass-by-value.

2) Next, distinguish a strong reference from a pointer.
* a regular strong reference ss1 wraps a pointer to the object "Hi", but the pointer has no technical name and we never talk about the pointer inside a strong reference.
** the pointer uses the "address" above to locate the object
** when you duplicate a remote control, you duplicate the pointer. You can then point the old remote control at another object.
** when no pointers point to a given object, it can be garbage collected.

Summary -- a pointer points to the Object "Hi", and a Strong reference named ss1 wraps the pointer. Note among the 3, only the strong ref has a name ss1. The other strong ref s is another real thingy in memory.

3) Now, weak reference. A weakref wr1 wraps a pointer to an obj (ie an onion/cookie), just like a strong ref. In a weak reference (unlike strong reference) the pointer is known as a "referent in the reference". Note wr1's referent is not ss1, but the object "Hi" referenced by ss1. That's why "Hi" is target of 4 pointers (4 reference). This object's address is duplicated inside all 4 variables (4 references).

"Referent in a reference" is the pointer to object "Hi". If you "set the referent to null" in wr1, then wr1 doesn't point to any object in memory.

Unlike strong references, a weak reference is sometimes mentioned like an object, which is misleading.

Q: Is the weak ref wr1 also an object? We explained a strong ref ss1 differs completely from the object "Hi".

A: Yes and no. you create it with new weakReference(..) but Please don't treat it like a regular object like "Hi". In our discussion, an object means a regular object, excluding reference objects. [[Hardcore Java]] page 267 talks about "reference object" and "referenced object" -- confusing.
A: java creators like to dress up everything in OO, including basic programming constructs like a thread, a pointer, the VM itself, a function (Method object), or a class (Class object). Don't overdo it. It's good to keep some simple things non-OO.

A: functionally, wr1 is comparable to the remote control ss1. Technically, they are rather different

2 comments:

Anonymous said...

I wish not agree on it. I regard as nice post. Especially the title attracted me to be familiar with the whole story.

Anonymous said...

Nice dispatch and this mail helped me alot in my college assignement. Thanks you for your information.

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