Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > What does the transient and volatile keywords do?

Reply
Thread Tools

What does the transient and volatile keywords do?

 
 
res7cxbi@verizon.net
Guest
Posts: n/a
 
      01-21-2006
What does the transient and volatile keywords do? Why would i use them?

I heard that the volatile keyword has not been fully implemented in
Sun's JVM. But yet most of the JDK (especially the I/O classes) use
this keyword. What's up with that?

 
Reply With Quote
 
 
 
 
IchBin
Guest
Posts: n/a
 
      01-21-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> What does the transient and volatile keywords do? Why would i use them?
>
> I heard that the volatile keyword has not been fully implemented in
> Sun's JVM. But yet most of the JDK (especially the I/O classes) use
> this keyword. What's up with that?
>


When your not sure consult the 'Bible', 'Java™ Language Specification'
http://java.sun.com/docs/books/jls/t...ses.html#78119


8.3.1.3 transient Fields
Variables may be marked transient to indicate that they are not part of
the persistent state of an object.

If an instance of the class Point:

class Point {
int x, y;
transient float rho, theta;
}

were saved to persistent storage by a system service, then only the
fields x and y would be saved. This specification does not specify
details of such services; see the specification of java.io.Serializable
for an example of such a service.

8.3.1.4 volatile Fields
As described in §17, the Java programming language allows threads to
access shared variables. As a rule, to ensure that shared variables are
consistently and reliably updated, a thread should ensure that it has
exclusive use of such variables by obtaining a lock that,
conventionally, enforces mutual exclusion for those shared variables.

The Java programming language provides a second mechanism, volatile
fields, that is more convenient than locking for some purposes.
A field may be declared volatile, in which case the Java memory model
(§17) ensures that all threads see a consistent value for the variable.

If, in the following example, one thread repeatedly calls the method one
(but no more than Integer.MAX_VALUE times in all), and another thread
repeatedly calls the method two:

class Test {
static int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}

then method two could occasionally print a value for j that is greater
than the value of i, because the example includes no synchronization
and, under the rules explained in §17, the shared values of i and j
might be updated out of order.

One way to prevent this out-or-order behavior would be to declare
methods one and two to be synchronized (§8.4.3.6):

class Test {
static int i = 0, j = 0;
static synchronized void one() { i++; j++; }
static synchronized void two() {
System.out.println("i=" + i + " j=" + j);
}
}

This prevents method one and method two from being executed
concurrently, and furthermore guarantees that the shared values of i and
j are both updated before method one returns. Therefore method two never
observes a value for j greater than that for i; indeed, it always
observes the same value for i and j.

Another approach would be to declare i and j to be volatile:

class Test {
static volatile int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}

This allows method one and method two to be executed concurrently, but
guarantees that accesses to the shared values for i and j occur exactly
as many times, and in exactly the same order, as they appear to occur
during execution of the program text by each thread. Therefore, the
shared value for j is never greater than that for i, because each update
to i must be reflected in the shared value for i before the update to j
occurs. It is possible, however, that any given invocation of method two
might observe a value for j that is much greater than the value observed
for i, because method one might be executed many times between the
moment when method two fetches the value of i and the moment when method
two fetches the value of j.

See §17 for more discussion and examples.

A compile-time error occurs if a final variable is also declared volatile.

--

Thanks in Advance...
IchBin, Pocono Lake, Pa, USA
http://weconsultants.servebeer.com/JHackerAppManager
__________________________________________________ ________________________

'If there is one, Knowledge is the "Fountain of Youth"'
-William E. Taylor, Regular Guy (1952-)
 
Reply With Quote
 
 
 
 
res7cxbi@verizon.net
Guest
Posts: n/a
 
      01-21-2006
thanks a lot!

 
Reply With Quote
 
Roedy Green
Guest
Posts: n/a
 
      01-21-2006
On 20 Jan 2006 21:06:05 -0800, (E-Mail Removed) wrote, quoted or
indirectly quoted someone who said :

>What does the transient and volatile keywords do? Why would i use them?


http://mindprod.com/jgloss/transient.html
http://mindprod.com/jgloss/serialisation.html
http://mindprod.com/jgloss/volatile.html
--
Canadian Mind Products, Roedy Green.
http://mindprod.com Java custom programming, consulting and coaching.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
why transient variable can not be final? Thomas Hawtin Java 1 04-13-2006 09:09 AM
Disable Session or Transient Cookies =?Utf-8?B?TmVsc29uIFAuIFZhcmdoZXNl?= ASP .Net 0 07-26-2005 05:50 AM
Use of the Volatile keyword for a pointer to a volatile memory block ben C Programming 5 01-11-2005 05:38 PM
What means? How to use : transient keyword! Se-Jin Park Java 1 11-18-2004 06:32 AM
Transient Questions, about internal URLs smackedass HTML 5 08-09-2004 09:39 PM



Advertisments