Return help
Hi there, apple told me to send my macbook in so they can replace it (i'm having the random shutdown problem) and they said they'd send me an email. I received an email that has my RMA info (and that means nothing to me because i have no clue what that is). I have no clue how this works. Am i supposed to be getting another email? does anyone know how this works? Help!!!
Hello c-mac,
The email you received from Apple should have the label that you need to print, cut out and tape to your shipping box. If you still have all the original packaging, use that, if not make sure you package it up well. You should have a date that FedEx or DHL will be coming to pick it up, you have to have it ready when they arrive. Once they come and pick up your old MacBook, make sure you get the Call Tag or Tracking number from the FedEx or DHL guy, call this number(800)676-2775 and tell them you have just had your defective MacBook picked up and you have the Call Tag/Tracking Number for them...they will then release your order for your new one and should get it within a week.
I recently had to return my 10 day old MacBook because of the random shutdown issue. I felt Apple Support was great. They were helpful and polite. I simply asked if it was necessary for me to go through all this troubleshooting on a 10 day old computer and the guy told me absolutely not, and they would set me up with a new one. Mine was picked up Monday and when I called AppleCare to give them my Call Tag Number the guy released my new one and said it will be shipped express and should be here by Friday. If your email doesn't say what date yours is scheduled for a pick-up, simply call the number I gave you and ask, I'm sure they'll answer all your questions.
Hope this helps :->
MacBook(white) 2GHz|1GRam|100GB|Wk27 iPod Nano 2GB Mac OS X (10.4.7) Switched July '06-I love-Love-LOVE my new MacBook!
Similar Messages
-
Sychronized Thread and return Help
Hi I am fairly new to Java and I am a bit confused on how to carry out this Operation and I could do with a fee suggestions
I ve got a aa class Decoder that implements runnable and when called it outputs and array.
Where my problem is that I am not quite sure on how to return that array.I ve declared the ouput as public but I am a lil confused on where to stick get output to get back my results
Thanks for your help in advance
cheers
chib
class decoder implements runnable{
run()
do something
synchronized setinput()
synchronised getoutput()
}Is it really a Thread you want to create? If you depend on the output of the calculation you should usually use a conventional method so that the caller will wait for the calculation to finish and use its results. If it really is a concurrent task, the result of which you need at some later time, use a class implementing Runnable, which holds the result with one of its fields:
public Decoder implements Runnable {
private InputType in;
private ReturnType ret;
private volatile boolean done;
public Decoder(InputType in) {
this.in = in;
this.done = false;
// not blocking test if done
public boolean isDone() { return done; }
// blocking request for return value
public synchronized ReturnType getResult() {
while(!done) try {
wait();
catch(InterruptedException e) {}
return ret;
public synchronized void run() {
ret = doCalc(in); // some complex calculation
done = true;
notifyAll(); -
whats the difference of using void and using the return?
i used last time the void and return, but the outputs of the two are the sameCodeSniffer wrote:
raychen wrote:
Using return within a method that returns void is just a quick way to go all the way to the end of the method. It is a goto in disguise, but sometimes it may make your code cleaner.yeah, thats what i saw when im trying to figure out whats the diff of the twoAsking about the difference between void and return is like asking about the difference between being bald and leaving your house. The two are not in any way related, and there's no context in which you can choose between one and the other.
You're going to have to clarify your question.
Do you know what void means?
Do you know what return does?
If you answered yes to both, then I really have no idea what you're confused about. -
@Return - Help with displaying error correctly
Hi,
I'm trying to use the @Return function to block users from entering a negative value in the 'FTE' member of the 'F T E' dimension. When I run the below from Business Rules menu it displays the error correctly in a window. However when I run when it's attached to a webform which I need, the error displays as:
Error Detected while attempting to run job: AAA - Non Discretionary Allocation - Budget.
ADF_FACES-60097: For more information, please see the servers' error log for an entry beginning with: ADF_FACES-60096:Server Exception during PPR, #3
So my question is why does it work perfectly from Business Rules menu but not from the Webforms?
Fix ( "No FTE" )
"512100" (
If(@ISMBR("8900"))
If("FTE" < 0)
@RETURN( @CONCATENATE(
@CONCATENATE("Negative values are not allowed as input into the dimension 'F T E' for member:[", @NAME(@CURRMBR("F T E"))),
"]. Please input a value greater or equal to zero to continue.")
, ERROR);
ELSE
@Round("FTE" * "Avg School Principal Salary"->"No Dept"->"Preliminary (Rolled)"->"No Fund"->"No Program",-2);
Endif Endif )Is that your real script? If you are only looking at "No FTE" (assuming it is from "F T E" dimension) why currmbr?
What is 8900 and 512100 are they accounts? If so why are you opening 512100 and checking for 8900?
If I were you and trying something like this and hit and error, I would try to put a value and see if that works or not. So if FTE<0 put 1 else put the formula.
Regards
Celvin -
The other night I was playing Brick, then put the 4Gig-2nd gen Nano in my pocket (with 3/4 battery power still left), then took it out to play again, a half hour later. I got a black screen, no reponse. I tried resetting it based on some of the recommendations in this forum - no good. I got it last Christmas - does it know when it's 11 months old? My son's (2!) 20Gig 2nd-gen iPods also died at around 11 months. I don't have any return options like your other posters.
I bought a battery replacement kit - should I install it?Error 1600, 1601, 1602: Try the following steps to resolve this error:
Ensure proper USB isolation troubleshooting has been performed, and test with a known-good cable.
Follow the steps listed for Error 1604.
This error may be resolved by disabling, deactivating, or uninstalling third-party security, antivirus, and firewall software. See steps in this article for details on troubleshooting security software.
Above from:
http://support.apple.com/kb/TS3694 -
I have a question about a return I made for the iphone 6.
I setup a return for a full refund and got the free UPS shipping label from apple. I sent the phone to the address on wednesday and it was delivered at 9:00 am.
The problem is, the apple orders page states that it is still waiting for my iphone to arrive. When will this be updated? This the final day of the refundI'm sorry, but Apple does not provide a downgrade path for iOS. Because downgrading is unsupported by Apple we cannot discuss it on these forums, but you can use Google to find information on how to install an older version of iOS on any iDevice.
-
Can someone please explain to me what I can do to bring my MacMail back and functioning? I will only say that when I click on the icon I get this:
**You cannot use this version of the application Mail with this version of MAC OS X**
If you want more details please see my other post. Thanks.It means you have an older version of Mail that's not compatible with the version of OS X that is installed. If you are running 10.5.8 as your profile states, then download and install the 10.5.8 Combo Updater. That should solve your problem.
Be sure the version of Mail you have is in the Applications folder. -
Item label help no longer allows HTML
Hi.
Moved to V4 from V3. The help text when displayed now escapes the HTML I have in place. I use DB functions to return help text (which include HTML markup) into a "hidden"-type field. That is then used in the help text definition for another item (i.e. P500_ITEM's help text field defined as "&P500_ITEM_HELP."). This worked in 3 but in new version, thw HTML is escaped. I have researched all the XSS, "save session state", display-only, etc. stuff I could find but there seems to be no solution.
How can I get HTML markup to render in the new-style JQuery Help dialogs in Apex 4?
Thanks.
-KHi,
Moved to V4 from V3. The help text when displayed now escapes the HTML I have in place. I use DB functions to return help text (which include HTML markup) into a "hidden"-type field. That is then used in the help text definition for another item (i.e. P500_ITEM's help text field defined as "&P500_ITEM_HELP."). This worked in 3 but in new version, thw HTML is escaped. I have researched all the XSS, "save session state", display-only, etc. stuff I could find but there seems to be no solution.How can I get HTML markup to render in the new-style JQuery Help dialogs in Apex 4?>
It is a new "feature". Use APPLICATION ITEM. See {thread:id=2411541}
Searching helps ! ;)
Cheers, -
Please rate the After Effects Help pages you find useful
You may have noticed that Adobe employees and Community Experts hanging in this forum keep pointing users to the relevant sections in After Effects Help on the Web. The reason for this is, of course, that the quality of explanations, visual examples, video tutorials and other materials in those pages is much higher than what anyone could quickly type in a forum reply. Personally, I think AE help has experienced a drastic overhaul in the last few years, to become a great, community-driven, user-focused resource.
if you find these pages helpful, you can in return help the documentation team by stating which pages you find useful by using the buttons at the bottom of each page.You should also leave comments to tell us what other information you'd like to see... or to leave a tip, link, or technique of your own.
After Effects CS4 Help -
Zero records returned in doc search using ctxsys.context with datastore COMMON_DIR
I do this and get 0 records returned - help:
begin
ctx_ddl.create_preference('COMMON_DIR','FILE_DATASTORE');
ctx_ddl.set_attribute('COMMON_DIR','PATH','/mydocs');
end;
create table mytable(id number primary key,
docs varchar2(2000))TABLESPACE USERS;
insert into mytable values(111555,'first.txt');
commit;
-- check that the document "first" exist
-- and it has the word "design"
ed \mydocs\first.txt
create index myindex on mytable(docs)
indextype is ctxsys.context
parameters ('datastore COMMON_DIR');
select id from mytable where contains(docs,'design')>0;Sorry use this:
select * from CTX_USER_INDEX_ERRORS;
Am I replying in the right place??
This is my first time using this thing... Yes, but there is also a special Oracle Text forum, please use
this the next time.
Thomas -
How can i convert object to byte array very*100 fast?
i need to transfer a object by datagram packet in embeded system.
i make a code fallowing sequence.
1) convert object to byte array ( i append object attribute to byte[] sequencailly )
2) send the byte array by datagram packet ( by JNI )
but, it's not satisfied my requirement.
it must be finished in 1ms.
but, converting is spending 2ms.
network speed is not bottleneck. ( transfer time is 0.3ms and packet size is 4096 bytes )
Using ObjectOutputStream is very slow, so i'm using this way.
is there antoher way? or how can i improve?
Edited by: JongpilKim on May 17, 2009 10:48 PM
Edited by: JongpilKim on May 17, 2009 10:51 PM
Edited by: JongpilKim on May 17, 2009 10:53 PMthanks a lot for your reply.
now, i use udp socket for communication, but, i must use hardware pci communication later.
so, i wrap the communication logic to use jni.
for convert a object to byte array,
i used ObjectInputStream before, but it was so slow.
so, i change the implementation to use byte array directly, like ByteBuffer.
ex)
public class ByteArrayHelper {
private byte[] buf = new byte[1024];
int idx = 0;
public void putInt(int val){
buf[idx++] = (byte)(val & 0xff);
buf[idx++] = (byte)((val>>8) & 0xff);
buf[idx++] = (byte)((val>>16) & 0xff);
buf[idx++] = (byte)((val>>24) & 0xff);
public void putDouble(double val){ .... }
public void putFloat(float val){ ... }
public byte[] toByteArray(){ return this.buf; }
public class PacketData {
priavte int a;
private int b;
public byte[] getByteArray(){
ByteArrayHelper helper = new ByteArrayHelper();
helper.putInt(a);
helper.putInt(b);
return helper.toByteArray();
but, it's not enough.
is there another way to send a object data?
in java language, i can't access memory directly.
in c language, if i use struct, i can send struct data to copy memory by socket and it's very fast.
Edited by: JongpilKim on May 18, 2009 5:26 PM -
Double Factory pattern purposal as replacement for Double Check #2
Hi All,
Here is the code for the pattern proposal, its intended as a replacement for double checked locking, which was proved to be broken in 2001. Here is the code...
public class DoubleFactory {
private static Object second_reference = null;
public static Object getInstance() {
Object toRet = second_reference;
if (toRet == null) {
second_reference = CreationFactory.createInstance();
toRet = second_reference;
return toRet;
private DoubleFactory() {}
public class CreationFactory {
private static Object instance = null;
public static synchronized Object createInstance() {
if (instance == null) {
instance = new Object();
return instance;
}Also I have spent several months discussing this with Peter Haggar, who believes that this code is not guaranteed to work. However I have been unable to discern from his message why he believes this will not be guaranteed to work, and I am posting this here to attempt to find a clearer explanation or confirmation that the pattern I am purposing (Double Factory) is guaranteed to work.
Thanks,
Scott
---------------------------- Original Message ----------------------------
Subject: Re: [Fwd: Double Factory replacement for Double Check #2] From:
"Scott Morgan" <[email protected]>
Date: Fri, January 25, 2008 10:36 pm
To: "Peter Haggar" <[email protected]>
Hi Peter,
I appologize if my last response came accross as rude or something. If
my code is not guaranteed to work ok, can you help me understand why. I
am after all looking for a solution for all of us.
If my solution is wrong as you say because the member variables of the
singleton are not up to date. I understand this to mean that the
second_reference pointer is assigned to the memory where the instance
object will get created before the instance object even starts the
creation process (when the jvm allocates memory and then enters the
constructor method of the Singleton). This doesn't seem possible to me.
Can you refrase your statments, to help me understand your points?
If not I am happy to turn to the original wiki for discussion.
Thanks for your effort,
Scott
Thanks for asking my opinion, many times, then telling me I'm
wrong...wonderful. You are a piece of work my friend. For what it'sworth, your email below shows you still don't understand these issues
or what I was saying in my emails. I've been more than patient.
>
All the best. And by the way, your code is not guaranteed to work. It's not just me that's "wrong", it's also the engineers at Sun who
designed Java, the JVM, and the memory model, and countless people who
have studied it. I'm glad you have it all figured out.
>
Peter
"Scott Morgan" <[email protected]>
01/18/2008 12:47 PM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
Re: [Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
Thanks I understand your position now. However am I still believe that
it will work and be safe;
1) the Singleton you show would be fully constructed (having exited theSingleton() method) before the createInstance() method would have
returned.
2) The second_reference could not be assigned until the createInstance()
method returns.
3) So by the time second_reference points to Singleton all of the valueswill be set.
>
>
I do understand that if the createInstance method was not synchronized(at the CreationFactory class level) that my logic would be flawed, but
since there is synchronization on that method these points are true, and
your comments about up-to-date values are not accurate.
>
Cheers,
Scott
>In your listing from your latest email T2 does encounter a sync block
on createInstance.
>>>>
No. T2 will call getInstance and see second_reference as non-null.second_reference was made non-null by T1.
>>
>>>>
What are you exactly are you refering to with the phrase 'up-to-datevalues'?
>>>>
Assume my singleton ctor is thus:
public class Singleton
private int i;
private long l;
private String str;
public Singleton()
i = 5;
l = 10;
str = "Hello";
T2 will get a reference to the Singleton object. However, because youaccess second_reference without synchronization it may not see i as 5,
l as 10 and str as "Hello". It may see any of them as 0 or null. This
is not the out of order write problem, but is a general visibility
problem because you are accessing a variable without proper
synchronization.
>>
Peter
"Scott Morgan" <[email protected]>
01/16/2008 11:38 PM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
Re: [Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
In your listing from your latest email T2 does encounter a sync blockon createInstance.
>>
What are you exactly are you refering to with the phrase 'up-to-datevalues'?
In this code the Singleton should also be
A) non mutable (as in the instance of class Object in the example).
If the singleton was more complex then the code to populate it'svalues
would go inside the sync of createInstance().
B) mutable with synchronization on it's mutator methods.
In your article you mention out of order writes, which doesn't occurin
this code.
Cheers,
Scott
You read it wrong.
- T1 calls getInstance which in turn calls createInstance.
- T1 constructs the singleton in createInstance and returns to
getInstance.
- T1 sets second_reference to the singleton returned in getInstance. -T1 goes about its business.
- T2 calls createInstance.
- T2 sees second_reference as non-null and returns it
- Since T2 accessed second_reference without sync, there is noguarantee
that T2 will see the up-to-date values for what this object refers to.
- Therefore the code is not guaranteed to work.
>>>
If this is not clear:
- Re-read my email below
- Re-read my article
- If still not clear, google on Double Checked Locking and readanything
from Brian Goetz or Bill Pugh.
Peter
"Scott Morgan" <[email protected]>
01/13/2008 05:26 AM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
Re: [Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
Thanks for the reply, I don't see how T2 would see the a referenceto
a
partialy initialized object before the createInstance() method had
returned. If T1 was in createInstance() when T2 entered
getInstance(), T2 would wait on the CreationFactory's class monitor to
wait to enter createInstance().
Or in other words in the line of code ....
second_reference = CreationFactory.createInstance();
The pointer second_reference couldn't be assigned to the singleton
instance when the synchronized createInstance() had fully constructed,initialized and returned the singleton instance. Before that the the
second_reference pointer would always be assigned to null. So any
thread entering getInstance() before createInstance() had returned
(for the first time) would wait on the CreationFactory's class monitor
and enter the createInstance() method.
>>>
So T2 will wait for T1.
Cheers,
Scott
PS I think I am writing requirements for my next project :)
Sorry for the delay...been in all day meetings this week.
You are correct...I had been reading your code wrong, my apologies.
My explanations, although correct, did not exactly correspond to your
code.
However, the code is still not guaranteed to work. Here's why:
Assume T1 calls getInstance() which calls createInstance() and returnsthe
singelton. It then sets second_reference to refer to that singleton.
So
far, so good. Now, T2 executes and calls getInstance(). It can see
second_reference as non-null, so it simply returns it. But, there
was
no
synchronization in T2's code path. So there's no guarantee that even
if
T2 sees an up-to-date value for the reference, that it will seeup-to-date
values for anything else, ie what the object refers to...it's
instance data. If T2 used synchronization, it would ensure that it
read
up-to-date
values when it obtained the lock. Because it didn't, it could see
stale
values for the object's fields, which means it could see a partially
constructed object.
>>>>
In the typical double-checked locking, the mistake is to assume theworst
case is that two threads could race to initialize the object. But
the worst case is actually far worse -- that a thread uses an object
which
it
believes to be "fully baked" but which is in fact not.
Peter
"Scott Morgan" <[email protected]>
01/03/2008 06:33 PM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
Re: [Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
Thanks for responding, I am still thinking that your mis
interpreting
the code so I have rewritten it here (Replacing
DoubleFactory.instance with DoubleFactory.second_reference for
clarity). If the T1 burps (gets interrupted) in the createInstance
method it wouldn't have returned so the second_reference pointer
would have never been
assigned
so T2 would just try again upon entering the getInstance method. Orif
it had already entered getInstance it would be waiting to enter
(until T1 releases the lock on CreationFactory.class ) on the
createInstance method.
>>>>
public class DoubleFactory {
private static Object second_reference = null;
public static Object getInstance() {
Object toRet = second_reference;
if (toRet == null) {
second_reference =
CreationFactory.createInstance();
toRet = second_reference;
return toRet;
private DoubleFactory() {}
public class CreationFactory {
private static Object instance = null;
public static synchronized Object createInstance() {
if (instance == null) {
instance = new Object();
return instance;
Does this clear up my idea at all?
second_reference should be always pointing to
null
or
a fully initialized Object
(also referenced by the pointer named 'instance' ), I don't see howit would end up partially initialized.
>>>>
Thanks Again,
Scott
"It" refers to T2.
Your createInstance method is identical to my Listing 2 and is fine
and
will work.
Yes, the problem with your code is in getInstance.
>I don't see how the DoubleFactory getInstance method could bereturning
a partially initialized object at this point. If CreationFactoryalways
returns a fully initialized object and DoubleFactory only assigns a
new
reference/pointer to it how could DoubleFactory getInstance return a
reference/pointer to partially initialized object?
>>>>>>>
>>>>>
The reason it is not guaranteed to work is explained in my previousemails
and in detail in the article. However, I'll try again. Anytime you
access shared variables from multiple threads without proper
synchronization, your code is not guaranteed to work. Threads are
allowed
to keep private working memory separate from main memory. There are
2
distinct points where private working memory is reconciled with main
memory:
- When using a synchronized method or block - on acquisition of thelock
and when it is released.
- If the variable is declared volatile - on each read or write of
that
volatile variable. (Note, this was broken in pre 1.5 JVMs which isthe
reason for the caveat I previously mentioned)
Your createInstance method uses synchronization, therefore, the
reconciliation happens on lock acquisition and lock release. T1 can
acquire the lock in createInstance, make some updates (ie create an
object, run it's ctor etc), but then get interrupted before exiting
createInstance and therefore before releasing the lock. Therefore,
T1
has
not released the lock and reconciled its private working memory withmain
memory. Therefore, you have ZERO guarantee about the state of mainmemory
from another threads perspective. Now, T2 comes along and accesses
"instance" from main memory in your getInstance method. What will
T2
see?
Since it is not properly synchronized, you cannot guarantee that T2sees
the values that T1 is working with since T1 may not have completely
flushed its private working memory back to main memory. Maybe it
did completely flush it, maybe it didn't. Since T1 still hold the
lock,
you
cannot guarantee what has transpired. Maybe your JVM is not usingprivate
working memory. However, maybe the JVM your code runs on does or
will
some day.
Bottom line: Your code is not properly synchronized and is notguaranteed
to work. I hope this helps.
Peter
"Scott Morgan" <[email protected]>
01/03/2008 12:49 PM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
Re: [Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
Thanks for your response, I don't follow what 'it' refers to in
the
phrase 'It can see'. So for the same reason that you state that
example 2 from your article I believe this class CreationFactory to
work flawlessly when a client object calls the createInstance
method.
>>>>>
I see this CreationFactory code as identical to your example 2 doyou agree with this?
>>>>>
public class CreationFactory {
private static Object instance = null;
public static synchronized Object createInstance() {
if (instance == null) {
instance = new Object();
return instance;
}Then my rational in the DoubleFactory class is that it can obtain a
reference/pointer to the fully initialized object returned bycalling the above code. I believe you think that the problem with
my code is
in
the DoubleFactorys getInstance method, is this correct?
I don't see how the DoubleFactory getInstance method could bereturning
a partially initialized object at this point. If CreationFactory
always
returns a fully initialized object and DoubleFactory only assigns a
new
reference/pointer to it how could DoubleFactory getInstance return a
reference/pointer to partially initialized object?
>>>>>
Thanks again,
Scott
public static synchronized Singleton getInstance() //0
if (instance == null) //1
instance = new Singleton(); //2
return instance; //3
This above code is fine and will work flawlessly.
Annotating my paragraph:
T1 calls getInstance() and obtains the class lock at //0. T1 "sees"
instance as null at //1 and therefore executes: instance = new
Singleton() at //2. Now, instance = new Singleton() is made up of
several lines of non-atomic code. Therefore, T1 could be
interrupted
after Singleton is created but before Singleton's ctor isrun...somewhere
before all of //2 completes. T1 could also be interrupted after
//2 completes, but before exiting the method at //3. Since T1 has
not
exited
its synchronized block it has not flushed its cache. Now assume T2
then
calls getInstance().
All still true to this point. However, with your code the nextparagraph
is possible, with the code above, it's not. The reason is that T2
would
never enter getInstance() above at //0 because T1 holds the lock. T2will
block until T1 exits and flushes it's cache. Therefore, the code
above
is
properly thread safe.
It can "see" instance to be non-null and thus
return it. It will return a valid object, but one in which its ctor
has
not yet run or an object whose
values have not all been fully flushed since T1 has not exited itssync
block.
"Scott Morgan" <[email protected]>
01/02/2008 06:10 PM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
Re: [Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
Thanks for the response I understand the rational for inventing
the
double check anti pattern, I am sorry I still don't understand the
difference between your solution #2 and my CreationFactory class.
>>>>>>
From your article figure 2.public static synchronized Singleton getInstance() //0
if (instance == null) //1
instance = new Singleton(); //2
return instance; //3
If I understand your email correctly this figure 2 is also flawed,since...
>>>>>>
T1 calls getInstance() and obtains the class lock at //0. T1 "sees"
instance as null at //1 and therefore executes: instance = new
Singleton() at //2. Now, instance = new Singleton() is made up ofseveral lines of non-atomic code. Therefore, T1 could be
interrupted
after Singleton is created but before Singleton's ctor isrun...somewhere
before all of //2 completes. T1 could also be interrupted after
//2 completes, but before exiting the method at //3. Since T1 has
not
exited
its synchronized block it has not flushed its cache. Now assume T2
then
calls getInstance(). It can "see" instance to be non-null and thus
return it. It will return a valid object, but one in which its
ctor
has
not yet run or an object whose
values have not all been fully flushed since T1 has not exited itssync
block.
So is #2 is also flawed for this reason?
If so please revise your article, since I interpreted #2 as a
plausible
solution recommended by you (which lead me to the DoubleFactory
idea).
If not please help me understand the difference between #2 and my
CreationFactory class.
>>>>>>
Thanks,
Scott
#2 is in Listing 2 in the article. What I meant was to forget the
DCL
idiom, and just synchronize the method...that's what listing 2
shows.
DCL
was invented to attempt to get rid of the synchronization for 99.9%
of
the
accesses.
The solution I outlined in my email is using the DCL idiom, but on
a
1.5
or later JVM and using volatile.
You solution is not guaranteed to work. Here's why:
public class DoubleFactory {
private static Object instance = null;
public static Object getInstance() {
Object toRet = instance;
if (toRet == null) {
instance =
CreationFactory.createInstance();
toRet = instance;
return toRet;
private DoubleFactory() {}
public class CreationFactory {
private static Object instance = null;
public static synchronized ObjectcreateInstance()
//1
if (instance == null) {
instance = new Object(); //2
return instance;
} //3
}T1 calls createInstance() and obtains the class lock at //1. T1"sees"
instance as null and therefore executes: instance = new Object() at//2.
Now, instance = new Object() is made up of several lines of
non-atomic
code. Therefore, T1 could be interrupted after Object is created
but
before Object's ctor is run...somewhere before all of //2
completes.
T1
could also be interrupted after //2 completes, but before exiting
the
method at //3. Since T1 has not exited its synchronized block ithas
not
flushed its cache. Now assume T2 then calls getInstance(). It can"see"
instance to be non-null and thus return it. It will return a
valid object, but one in which its ctor has not yet run or an
object
whose
values have not all been fully flushed since T1 has not exited itssync
block.
The bottom line is that if you are accessing shared variables
between
multiple threads without proper protection, you are open for aproblem.
Proper protection is defined as: proper synchronization pre 1.5,
and
proper synchronization or proper use of volatile 1.5 or after.
Therefore, if you must use the DCL idiom you have one option: -
Use DCL with volatile on a 1.5 or later JVM.
>>>>>>>
You can also forget about DCL and just use synchronization (listing2
in
my article) or use a static field (listing 10 in my article).
I hope this clears it up.
Peter
"Scott Morgan" <[email protected]>
01/02/2008 04:00 PM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
Re: [Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
I apologies for not understanding but I don't see what is
different
between the solution you purposed...
2) Don't use DCL but use synchronization
and the code that I am putting forward. Perhaps I do just notunderstand
but you seem to be contradicting yourself in this email?
I understand that you are saying in #2 that this will always 'work'
with
out any issues...
public static Object instance = null;
public static synchronized Object getInstance() {
if (instance == null) {
instance = new Object();
return instance;
But first you seem to say in the email that if T1 gets
interrupted
it
may leave the instance pointing to a partially initialized object?
So as far as I understand it the createInstance method in my
CreationFactory class should be successful (always retuning a
fully initialized object) for the same reason #2 is successful.
Please keep in mind that there are two different instancepointers
in
the code I sent you, one is part of the DoubleFactory class and
the other is part of the CreationFactory class.
>>>>>>>
Thanks for your time, just looking for better solutions!
Scott
Scott,
Your solution is not guaranteed to work for various reasons
outlined
in
the article. For example, you can still return from your code apartially
initialized object. This can occur if T1 gets interrupted beforeleaving
the synchronized method createInstance() and T2 calls
getInstance().
T2
can "see" toRet/instance as non-null but partially initialized
since
T1
has not fully flushed its values.
As of 1.5, Sun fixed various issues with the memory model that
were
broken. Double Checked Locking will still break unless you usevolatile
(which was fixed in 1.5). Therefore, the following code works:
volatile Helper helper;
Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = new Helper();
return helper;
but the original DCL idiom will not work. So, your options are:
1) Use DCL with volatile (above)
2) Don't use DCL but use synchronization
3) Don't use DCL, but use a static field.
#2 and #3 are outlined in my article from 2002.
Hope this helps,
Peter
"Scott Morgan" <[email protected]>
12/26/2007 04:12 PM
Please respond to
[email protected]
To
Peter Haggar/Raleigh/IBM@IBMUS
cc
Subject
[Fwd: Double Factory replacement for Double Check #2]
Hi Peter,
Thanks for the article on the out of order write problem. Whatdo
you
think of this as a solution?
TIA,
Scott
---------------------------- Original Message----------------------------
Subject: Double Factory replacement for Double Check #2
From: "Scott Morgan" <[email protected]>
Date: Wed, December 26, 2007 2:55 pm
To: [email protected]
Hi Ward,
Here is a pattern submission
Double Factory
Lazy initialization of singletons in accepted for a while usingthe
double check pattern. However it has been discovered that the
double
check pattern isn't thread safe because of the out of order write
problem. This problem occurs when Threads entering the Singleton
Factory method return with a fully constructed, but partially
initialized, Singleton object.
>>>>>>>>
Therefore: It makes sense to look for a way to initializeSingletons
in
a Lazy and Thread Safe manor. The following illustrates a fairly
simple
solution...
package foo;
public class DoubleFactory {
private static Object instance = null;
public static Object getInstance() {
Object toRet = instance;
if (toRet == null) {
instance =
CreationFactory.createInstance();
toRet = instance;
return toRet;
private DoubleFactory() {}
public class CreationFactory {
private static Object instance = null;
public static synchronized ObjectcreateInstance()
if (instance == null) {
instance = new Object();
return instance;
This gets around the out of order write problem because all
Threads
waiting on the CreationFactory's Class monitor will have a fully
constructed and initialized instance when they actually exit the
createInstance method.
>>>>>>>>
>>>>>>>>
During runtime while the Singleton instance is getting created(constructed and initialized) there may be a few Threads waiting
on
the
CreationFactory Class's objects monitor. After that period all
the
Treads
accessing
the Singleton will have unsynchronized reads to the instance,
which
will
optimize execution.
References:
http://www.ibm.com/developerworks/java/library/j-dcl.html
Copyright 2007 Adligo Inc.Scott-Morgan wrote:
Hi All,
Thanks for your comments, here are some more....
jtahlborn you state that
the only way to guarantee that a (non-final) reference assignment is visible across threads is through the use of volatile and synchronized,
From the jvm spec
http://java.sun.com/docs/books/jls/third_edition/html/memory.html
17.4.1 Shared Variables
Memory that can be shared between threads is called shared memory or heap memory.
All instance fields, static fields and array elements are stored in heap memory.
Since both the second_reference and instance fields are both static, they are shared and visible across all threads.Yes, all these things are shared across threads, however, if you keep reading, there is a notion of "correct" sharing. obviously these values may be visible, that's why double-checked locking was used for so long before people realized it was broken. it worked most of the time, except when it didn't, and that's what i'm trying to show. that the only way to correctly share state between threads is via synchronization points, the most common being volatile and synchronized (there are a couple of other less used ones which don't apply here). The articles you linked to below from ibm cover the "visibility" in great depth, this is exactly what i am referring to.
You also state that volatile is a solution, but you seem to rebut your self in stating that the overhead for volatile is almost as great as synchronization.
This article illustrates the solution, and also comments on the overhead of volatile.
http://www.ibm.com/developerworks/library/j-jtp03304/
linked from
http://www.ibm.com/developerworks/java/library/j-dcl.html
volatile is a solution, in that it is correct, and you avoid the appearance of synchronization each time. however, since the semantics of volatile were strengthened in the new memory model, using volatile will perform practically (if not exactly) the same as simply synchronizing each time. the article you link to says exactly this under the heading "Does this fix the double-checked locking problem?".
Also could you be more specific about the example at the end of the jvm memory spec page, like a section number?It's the very last thing on the page, the "discussion" under 17.9, where it mentions that changes to "this.done" made by other threads may never be visible to the current thread. -
Drop the files into different directories based on the filename
Hi,
I had a reqiuirement based on the file name, i should drop the files in to different directories.
I can get the filename through variable substitution in receiver file communication channel, now i want to drop the file into different folders based on conditions.
suppose, if the file name is DDDX234
i should do substring of filename0+(4), if the value is L then i should drop in X directory
suppose, if the file name is DDDY234
i should do substring of filename0+(4), if the value is L then i should drop in Y directory.
How can i drop the file into differnent directories based on filename.
Thanks
SrinivasThanks Michal,
I mapped the directory and filename to the target header in the mapping
Filename --> UDF --> Header(target)
and in the receiver channel checked the ASMA and given * in the filename and directory name.
But in runtime iam getting the error as
Attempt to process file failed with com.sap.aii.adapter.file.configuration.DynamicConfigurationException: The Adapter Message Property 'FileName' was configured as mandatory element, but there is no 'DynamicConfiguration' element in the XI Message header
MY UDF is
public String Directory(String a,Container container){
DynamicConfiguration conf = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
DynamicConfigurationKey key = DynamicConfigurationKey.create( "http://sap.com/xi/XI/System/File", "FileName");
DynamicConfigurationKey key1 = DynamicConfigurationKey.create( "http://sap.com/xi/XI/System/File", "Directory");
String FileName = conf.get(key);
FileName = a;
conf.put(key, FileName);
%%%based on filename the directory should change
String Directory = conf.get(key1);
Directory = "/SAPInterface/XI/PPD/DHX/out";
conf.put(key1, Directory);
return "";
Help me in correcting this error.
Thanks
Srinivas -
Need of a self explanatory method like toString(): Your Opinion?
Hi All,
If including a method like showHelp() is recommended as
java programming standard like incorporating toString() in
a class, it will serve as an online help mechanism for
developers using the class. It will be helpful reference
when the source code or API documentation is not available.
Also it will be a nice mechanism for the coder to give
usage information of his class to a newbie or intermediate java programmer.
Example:
public class MyClass {
public int width;
public MyClass() {
public String toString() {
return "Class:MyClass, width:"+width;
public String showHelp(){
String help;
help = "This class is intended to use for.. \n\n";
help += "Typical Usage is... \n\n";
help += "Sample code as followed...\n\n Thank you.";
return help;
}This is what Sun's reply when I submit the feature.
"If you feel this should be implemented and the need is justified,
please start a topic in the JDC forum to see if there is support, and
email me the link. Thanks."
Please share your views regarding this feature.
Thanks.
-bathraMy question is how would this build over Javadoc standards? With the showHelp() method available, wouldn't this be useful only for the programmer? What about running Javadoc on the class and reading the html produced by it? That's what it's there for.
http://java.sun.com/j2se/1.4/docs/api/index.html
If a closed source class file does not have well written thorough documentation, what good will the showHelp() provide? If the documentation isn't available, the question would be why should the class file even be used if you won't have the documentation to be able to use it properly. If the class file is a purchased 3rd party component, that group is responsible for providing good documentation.
This would dramatically increase the size of the compiled Java Bytecode as most comments I've seen are more than tripple than the source of a .java file. Including the comments as an output method could be overkill. My personal opinion is to follow the Javadoc standard and include the html output. Well written tight code is mainly what I'm after. -
How do I start and suspend Java Application from say C++ program
I want to start a Java application via C++ and on some condition i want to suspend the same program not terminate , but suspend
Have you tried running the virtual machine from your C++ application ? You can start Java applications from your C++ application using JNI after starting the Virtual machine from within your C++ application. According to the Java documentation you can even now stop the virtual machine from within your C++ program.
I haven't looked at the 'suspend' detail but I suppose it will not be a problem to call a method via JNI to set a flag to suspend a thread etc.
There is a tutorial: 'Invoking the Java Virtual Machine' at the following URL: http://java.sun.com/docs/books/tutorial/native1.1/invoking/invo.html.
This example seems to work only for version1.1 of the JDK. For JDK1.3, version 1.2, (I am not so sure whether I fully understand Sun's version numbers for Java yet) there is some updates on the JNI for starting the VM from C++. This article is called 'JNI Enhancements'. The URL for this article is:
http://java.sun.com/j2se/1.3.0/docs/guide/jni/jni-12.html
You have to set version to: JNI_VERSION_1_2
There is only one problem. I get an error when calling JNI_CreateJavaVM from C++. I could not find any documentation that indicates how you can go about diagnosing what is causing the problem. Normally in Visual C++ you can just get the probable cause by inspecting GetLastError() or the function itself can return helpful diagnostic (error) codes.
If you manage to start the VM correctly from within Visual C++ please let me know. My email address is [email protected]
good luck
Henko
Maybe you are looking for
-
AEBS cannot see both disks in 2 disk enclosure set to JBOD
I have a MacPro 3.1 and AEBS, the computer runs 10.6.8 and Win 7. All most recent updates installed on both OSes and the AEBS. I have a generic (bought at Fry's) HORNETTER, 2 disk external USB enclosure containing two (2) 500GB hard drives, both for
-
Is there any way to properly and accurately calibrate my HTPC Mac MIni's brightness and contrast? I've noticed the blacks are extremly dark and quite frankly "crushing" Plex can't seem to retain the selected settings, instead I need to adjust them fo
-
No Sound on virtual Windows 2008 R2 terminal servers
Hello. I have a hyper-v server with 3 terminal servers (in fact there are two hyper-v with a totall of 6 terminal servers). Hyper-V server is W2K8R2 and so are the terminal servers. Users connect to the terminal servers using RDP and are unable to pl
-
Help with ASP Insert Into Command
Hi All, I'm trying to get the following command (insert into) to work, but am having no joy. I would be greatful if you could highlight what i have done wrong. Its an for an ASP site using an MS SQL database - <% if(Session("BATCHID2") <> "") then in
-
Cannot open wapsite with Blackberry. Other phones open the site.
Hi, I am trying to access the site http://cutit.wap.sh/Stem . This site does not display on my blackberry curve 8520. On the blackberry bold the site works as well as on any other phone. Is there any settings I can change for my phone to show the