Question about synchronized re-entry

Suppose I have the following code:
* method performs actions that require synchronization on state but
* the programmer ensures manually that it is only called in a context
* where we are already synchronized on state
private void veryPrivateMethod() {
    //synchronized(state) { (*) required?
    if (state == 999) {
        // perform actions that require synchronization on state
public void anotherMethod() {
    synchronized(state) {
        if (state == 42)
            state = 43;
        veryPrivateMethod();
}See (*): If I ensure manually that veryPrivateMethod will only be called in a context where we are already synchronized on state, do I still need to specifically synchronize on state in the method (reentrant synchronization), or will it be better performance-wise and still safely synchronized if I omit the synchronized statement in veryPrivateMethod()?
Thanks!

gimbal2 wrote:
932196 wrote:
I synchronize on it whenever I change / compare-change it. Is this a bad ideaThat's a maybe. Its not a bad idea, as long as you realize that doing this has no special meaning and will offer no special protection. You can synchronize on just about any object you want, as long as other threads synchronize on the exact same object when wanting to execute the same section(s) of volatile code.the comment in the example is:
// perform actions that require synchronization on statethis leads me to believe that the code is not correctly synchronized currently. like i said, changing the reference to the object you are synchronizing on pretty much always leads to broken code.

Similar Messages

  • Question about "synchronized" and "wait"

    Hello, everyone!
    I have seen a piece of code like this,
    synchronized (lock)
    //do operation 1
    lock.wait();
    //do operation 2
    I think in the above piece of code, when a thead finished operation 1, it will release the lock and let other threads waiting for the lock have chance to run the same block of code. Am I correct?
    If I am correct, I have a further question, a "synchronized" block means a set of operations that can not be interrupted, but when invoke "wait" method, the thread running in the "synchronized" block will be terminated (interrupted) by release the lock and other threads will have chance to enter the "synchronized" block. In short, the execution inside the "synchronized" block will be interrupted. So, I wonder whether the above piece of code is correct and conforms to the principle of "synchronized". And what is its real use?
    Thanks in advance,
    George

    Thanks, pkwooster buddy!You're welcome
    I just wondered whether "wait inside a synchronized
    block" technology is thread safe. Please look at the
    following example,wait and synchronized are thread safe.
    public class Foo {
    int mVal= 0;
    public final Object mLock = ...;
    public void doIt() {
    synchronized(mLock) {
    mVal = ...;
    mLock.wait();
    if (mVal == ...) {
    // do something
    } else {
    // do something else
    }If we have two threads, T1 and T2, enter the block in
    their respective order, and T1 is woken up first, T2
    may have tampered with T1's execution path because T2
    changed mVal while T1 was asleep. So T2 manipulate
    instance field mVal is a side-effect.when you do the wait() you give up the lock and the other threads get a chance to run. When you exit the wait() you get the new value of the myVal variable which may have been changed. This is exactly what you want. To make that not thread save you could do
    int temp = myVal;
    wait();
    if(temp == ...)in this case the variable temp contains the old vale of myVal.
    >
    I think the most safest way is never wait inside a
    synchronized block, but it is less efficient. What do
    you think about the trick of wait inside a
    synchronized block? I think you are very experienced
    in thread field from your kind reply.
    Thanks in advance,
    Georgewait(), notify() and notifyAll() are very useful. You need them when you want threads to cooperate in an predictable manner. I recommend that you review the section on consumer and producer classes and wait and notify in the Threads Tutorial. It gives good examples. For a practical example of this you could also take a look at my Multithreaded Server Example. It implements a simple chat server that switches String messages. Look especially at the send(), doSend() and popMessage() methods in the StreamConnection class. These allow the receive thread of one user to send messages out using the send thread of another user. If you have questions about that example, please post the questions on that topic.
    Hope this helps.

  • Question about synchronized

    Hello everyone,
    Suppose I have a method which is a synchronized method (for example, method Foo in the following code block), and in this synchronized method another method which is not synchronized is invoked (for example, method Goo in the following code block). I am wondering when executing in Goo from Foo, whether we still have the synchronized feature (i.e. obtain the lock of "this" object).
    synchronized public Foo()
        Goo();
    private Goo()
    }Thanks in advance,
    George

    Kaj,
    Hi, pls see my post above - I replied to the same question in the other forum and I was pretty sure about my answer until I found it different from ur reply here.
    Here is my reply. Can u kindly guide me to what's wrong in it ?
    if a lock on a sync-ed method extends to all methods being called from it, then the jvm (bcos it has no means of knowing until runtime the method calls from a sync method) has to lock all the methods in a class that has atleast one sync method.
    What this would mean potentially is that the effect of sync-ing one method would be equal to sync-ing all the methods bcos any of the other methods could be potentially called from the sync-ed one.
    The example below is co-erced, but serves to illustrate the point.
         public class Test
        synchronized public  void Foo()
            Goo();
        synchronized public  void Moo()
            Goo();       
            notify();
        private void Goo()
            System.out.println(Thread.currentThread().getName()+" accessing goo");
            try
                if(Thread.currentThread().getName().equals("Th one"))
                     //force thread1 to wait , lets see if thread2 can access it while thread1's waiting on it
                    wait();
            catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+" returning from goo");
    //first thread
    public class MyT implements Runnable
        Test t;
        public MyT(Test t)
            this.t = t;
        /* (non-Javadoc)
         * @see java.lang.Runnable#run()
        public void run()
            t.Foo();
    //second thread
    public class MyT2 implements Runnable
        Test t;
        public MyT2(Test t)
            this.t = t;
        /* (non-Javadoc)
         * @see java.lang.Runnable#run()
        public void run()
            t.Moo();
    //Main
    public class Main
        public static void main(String[] args)
            Test t = new Test();
            Thread th = new Thread(new MyT(t),"Th one");
            Thread th1 = new Thread(new MyT2(t), "Th two");
            th.start();
            th1.start();       
    And the o/p I got was
    Th one accessing goo/*thread one in goo, is in wait() coz of the funny if clause there*/
    Th two accessing goo /*there's no lock on goo, else with thread one in wait(), this wouldve been impossible*/
    Th two returning from goo/*Thread 2 is over with Goo(), will go back and notify Thread 1*/
    Th one returning from goo/*Thread 1 is notified, wakes up and returns :-)*/
    tx,
    ram.

  • Dumb question about user_sdo_geom_metadata DIMINFO entries

    I'm sure that this is a dumb question!
    I create a new entry in user_sdo_geom_metadata as follows...
    INSERT INTO USER_SDO_GEOM_METADATA
    VALUES ( 'PR_A', 'GEOM',
    MDSYS.SDO_DIM_ARRAY(
    MDSYS.SDO_DIM_ELEMENT('X',190000.0,640000.0, 0.05),
    MDSYS.SDO_DIM_ELEMENT('Y',120000.0,680000.0, 0.05)
    NULL );
    But when I select the DIMINFO from the table...
    SQL> select diminfo from user_sdo_geom_metadata a where table_name = 'PR_A';
    DIMINFO(SDO_DIMNAME, SDO_LB, SDO_UB, SDO_TOLERANCE)
    SDO_DIM_ARRAY(SDO_DIM_ELEMENT('X', 190000, 640000, 0), SDO_DIM_ELEMENT('Y', 1200
    00, 680000, 0))
    The sdo_dim_element and sdo_tolerance
    elements show no decimal places.
    Is this because I have not set some
    display number format option in SQLPLUS
    or for some other reason?
    regards
    Simon

    Simon,
    If you are using an old sqlplus client
    (815) then you won't be able to see the decimal places in the diminfo object.
    But if you hace a newer (816/817) sqlplus
    client you should be able to see the decimal places.
    If you are not seeing them in these clients
    then there might be some format paramter set
    to show numbers without decimals.
    You can do a
    show numformat
    in sqlplus to see if there is any format set for that paramter.
    null

  • Question about nouveau wiki entry (keep both drivers installed?)

    In this section:
    https://wiki.archlinux.org/index.php/No … _installed
    It talks about ways to keep both drivers installed. As far as I can tell both drivers cannot be installed at the same time because of the conflicting packages  "mesa-libgl" and "nvidia-libgl". Is there in fact a way to have both of these packages installed? Seems like in that entry section there is a lot of useful information. Not sure which sections to keep and which to rename / move etc.. Wanted to put up a discussion about this first to see what needs to be done if anything.
    Last edited by dodo3773 (2013-12-10 20:28:39)

    I agree on "keep both drivers installed" issue.
    I've done some modifications to the nouveau -> nvidia and the other way round scripts, too (so they'll install/ uninstall the way they should). Might add that tomorrow.

  • Question about synchronized static function.

    Hi, everyone!
    The synchronized statement often deals with an object (called monitor).
    But a static function can be invoked without an object.
    So if a static function is declared as static, what is the function of
    static and synchronized here? Which lock it is using?
    Can you give me a simple expplanation?
    regards,
    George

    Hence try and avoid synchronizing static methods.
    Try and use non static method if you are doing
    multithreaded programming. That way you can have lockWell, I avoid static methods, not just when doing multithreading, but not for the reason you mention.
    objects which allow non interfering methods to be
    accessed in parallelThats easy to do with static methods anyway:
    class Foo
      static Object lock1 = new Object();
      static Object lock2 = new Object();
      static void method1()
         synchronized( lock1 )
      static void method2()
         synchronized( lock2 )
    }Maybe I just missunderstod you...

  • Question about synchronizing two methods...

    i have 2 methods:
    writeData() //method 1
    createNewDataFile() //method 2
    the main thread will be using method 1 quite frequently. In method 2, a separate thread will be waking up every 10 minutes or so and doing some maintenance on the file written to in method 1. So, when the thread is in method 2 i need method 1 to standby and wait. I also want the opposite, that when the main thread is in method 2 method 1 will stand by.
    Any help is appreciated!

    799454 wrote:
    So wait,
    i thought synchronized only worked on the actual methods where it is declared:Using the synchronized keyword obtains a lock. Each object has exactly one lock associated with it. Once a thread has obtained an object's lock, no other thread can obtain that lock (and hence cannot enter a sync block on that lock) until the first thread releases it by leaving its sync block or calling wait().
    so, you're saying that if i declare:
    synchronized method 1
    synchronized method 2
    then i have a single object with 2 synchronized methods, so if thread A is in EITHER of those methods, the other method will be locked as well?The method isn't "locked" per se, but yes, 1 object, 2 synced methods, if T1 is in either method, then T2 cannot enter either method.
    I strongly urge you to go through that tutorial and/or a book on Java concurrency, thoroughly.

  • Question about 'hosts: cluster' entry in /etc/nsswitch.conf

    Hi~
    my system have "hosts: cluster files dns" entry in /etc/nsswitch.conf.
    I know 'files' to see the '/etc/hosts'.
    I want to know that 'cluster' to see 'what file'.
    Thanks,

    'cluster' denotes internal lookups, i.e. no file on the file system. If I recall correctly, it allows the system to look up the cluster interconnect private addresses.
    Tim
    ---

  • Question about synchronized singleton classes

    Hi,
    I have a singleton class, with only 1 method (which is static), I want access to that method to be synchronized, but someone suggested that I make my getInstance() method synchronized as well.
    Is this neccessary, or is it overkill?
    thanks!

    Example:
    static Instance getInstance() {
    if (instance == null) {
    instance = new Instance();
    return instance;
    }Two threads call it simultaneously:
    1. if (instance == null) { // evaluates true
    2. if (instance == null) { // evaluates true
    1. instance = new Instance(); // first instance
    2. instance = new Instance(); // second instance,
    deleting the reference to the first instance
    1. return instance; // which is not the originally
    created one but the second instance
    2. return instance;There's actually a worse consequence.
    1) T1 sees null
    2) T1 sets instance to point to where the object will live
    4) T2 sees non-null
    3) T2 returns, with a pointer to what's supposed to be an object, but isn't yet inited.
    4) T1 eventually inits the instance
    This can happen even if you use the "double check locking" pattern of synchronization.
    At least under the old memory model. I think the new JMM in effect in 5.0 (and possibly later 1.4) versions fixes it. I don't know if the fact that it can happen in absence of sync/DCL is an error or not, so I'm not sure if that's addressed in the new JMM, or if it's only the synced case that was a bug. (That is, it might be okay that it happens without syncing.)

  • A question about synchronized Lists...

    If I have a synchronized list, and I have a synchronized block in one thread with a lock on that list (synchronized(List)) am i supposed to be able to add an item to that list directly (using the List.add() method) from another thread while I'm still in the synchronized block previously described?
    I have some code here where I tried to test that and the answer that I got is that it is possible while (I believe) it's not possible theoretically speaking.
    import java.util.*;
    public class Warehouse implements Runnable{
         List<String> items = Collections.synchronizedList(new ArrayList<String>());
    //     List<String> items = new ArrayList<String>();
         public static void main(String[] args){
              Warehouse w = new Warehouse();
              Manager m = new Manager(w);
              Thread one = new Thread(w);
              Thread two = new Thread(m);
              one.start();
              two.start();
         public void add(String t){
              synchronized(items){               
                   for(int i=0; i<2; ++i){
                        System.out.println("Warehouse added item...");
                        try{
                        Thread.sleep(500);
                        }catch(InterruptedException ie){
                             ie.printStackTrace();
                   items.add(t);
                   items.notify();
         public void run(){
              for(int i=0; i<1; ++i){
                   synchronized(items){
                        while(items.isEmpty()){
                             try{
                             System.out.println("Warehouse waiting...");
                             items.wait();
    //                         System.out.println("Warehouse after waiting...");
                             for(int j=0; j<2; ++j){
                                  System.out.println("Warehouse after waiting...");
                                  try{
                                  Thread.sleep(500);
                                  }catch(InterruptedException ie){
                                       ie.printStackTrace();
                             }catch(InterruptedException ie){
                                  ie.printStackTrace();
    class Manager implements Runnable{
         Warehouse w;
         public Manager(Warehouse w){
              this.w = w;
         public void run(){
              for(int i=0; i<1; ++i){               
                   System.out.println("Manager Adding item...");
                   w.add("articulo");                              
                   for(int j=0; j<5; ++j){
                        w.items.add("jeje");
                        try{
                        Thread.sleep(500);
                        }catch(Exception ex){ex.printStackTrace();}
                        System.out.println("Manager adding to items");
                   System.out.println("Manager finished with warehouse...");
    }Output:
    Warehouse waiting...
    Manager Adding item...
    Warehouse added item...
    Warehouse added item...
    *Warehouse after waiting...*
    *Manager adding to items*
    *Warehouse after waiting...*
    *Manager adding to items*
    Manager adding to items
    Manager adding to items
    Manager adding to items
    Manager finished with warehouse...The code in "bold" (with the tokens) isn't supposed to happen concurrently as I understand it since the "warehouse after waiting" statement it's in the synchronized block with a lock on the items list and the "manager adding to items" statement is adding an item to that list through a direct reference to that list...

    When the manager thread notifies the items (warehouse thread), the warehouse thread does not have to wake up automatically, it has to compete for the items lock then wait for its Thread context to execute. Which means that the manage is able to continue to execute - adding to items manually, and eventually sleep()ing. When the manager thread sleeps that is a good place for a Thread context switch, and if the JVM takes that opportunity to do so, then the warehouse thread regains the lock and would prevent further access to items. But at some point the Thread context will switch again (probably when warehouse thread goes to sleep). Now the manager thread can wake up, print that it is working because that code is not protected by any synchronized lock. Then when it attempts to add to items again it blocks. Another thread context switch allows the warehouse to complete its work, finish up, and release the items lock. Manager can then get the lock on items and finish its work. The results would be exactly as you display them. Here is a possible walk-through of the threading paths taken:
    Thread == Warehouse
    i = 0
      lock on items
        items.isEmpty == true
          print "Warehouse is waiting"
          items.wait (unlock items)
    /* CONTEXT SWITCH */
    Thread == Manager
    i = 0
      print ""Manager Adding item..."
      locking items
        i = 0
          printing "Warehouse added item..."
          sleeping 500
        i = 1
          printing "Warehouse added item..."
          sleeping 500
        i ! < 2
        locking items
          adding to items
        unlocking items
        notifying items (wait will unlock eventually)
      unlocking items
      j = 0
        locking items
          adding to items
        unlocking items
        sleeping 500
    /* CONTEXT SWITCH */
    Thread == Warehouse
          items.wait (regain lock and get context)
          j = 0
            prinitng "Warehouse after waiting..."
            sleeping 500
    /* CONTEXT SWITCH */
    Thread == Manager
        sleeping 500 is done
        printing "Manager adding to items"
      j = 1
        locking items (blocking until items is available)
    /* CONTEXT SWITCH */
    Thread == Warehouse
            sleeping 500 is done
          j = 1
            printing "Warehouse after waiting..."
          j ! < 2
        itemse ! isEmpty
      unlocking items
    i ! < 1
    /* End of Warehouse Thread */
    /* CONTEXT SWITCH */
    Thread == Manager
        locking items (lock available)
          adding to itemes
        unlock items
        sleeping 500
        printing "Manager adding to items"
      j = 2
        locking items
          adding to itemes
        unlock items
        sleeping 500
        printing "Manager adding to items"
      j = 3
        locking items
          adding to itemes
        unlock items
        sleeping 500
        printing "Manager adding to items"
      j = 4
        locking items
          adding to itemes
        unlock items
        sleeping 500
        printing "Manager adding to items"
      j ! < 5
      printing "Manager finished with warehouse..."
    i ! < 1
    /* End of Manager Thread */So the theory an practice are the same - you can not access the items object when it is locked by another thread. The problem is that your test does not demonstrate when locks are held and released - some of the output you expect to be protected is not and so you mis-interpret the code.

  • Question about my log entry showing data file is excluded.

    I am new user of Sophos for Mac.  I have OS 10.10.3 installed. My log says: com.sophos.intercheck: Info: Exclusion: /Volumes/Data/ at 12:48 on 13 June 2015
    com.sophos.intercheck:
    com.sophos.intercheck: Info: Exclusion: /Volumes/Time Machine Backups at 12:48 on 13 June 2015
    com.sophos.intercheck: I understand the time machine exclusion, but not the Volumes/Data. I have excluded nothing in preferences.  In "On-Access," the excluded items pane is blank.  Is the above normal for a log in a situation where no exclusions have been made (although the check network volumes (like time machine?) has not been ticked). Thanks.

    Hi again bobalaska,
    Is /Volumes/Data located on a network? that would be the obvious reason for that exclusion to exist..

  • Question about Update Tables

    Hello Gurus,
    I have a question about "update table" entries. I read somewhere that an entry in update table  is done at the time of the OLTP transaction. Is this correct? If so, does this happen on a V1 update or V2 update? Please clarify. Similarly, an entry in the "extraction queue" (incase you are using "queued delta" will happen on V1 update. I just want to get a clarification on both these methods. Any help in this matter is highly appreciated.
    Thanks,
    Sreekanth

    Hi
    update tables are temporary table that are refreshed by v3 job.update table is like buffer, it gets filled after updation of application table and statistical table through v1 v2 update .  we can bypass this process by delta methods.
    M Kalpana

  • Follow-up on question about copying 10.4

    I only got one reply to my question about how to copy OS 10.4 from one internal drive to another and unfortunately, the response was cut short. Something about if I had another computer with Firewire, using it and that's as far as the response went. Yes, I have a  laptop and have Firewire, but still don't know how to use it to help.

    If you just wish to make a duplicate of one hard drive to another hard drive in the same G5, then do this:
    Clone using Restore Option of Disk Utility
    Open Disk Utility from the Utilities folder.
    Select the destination volume from the left side list.
    Click on the Restore tab in the DU main window.
    Check the box labeled Erase destination.
    Select the destination volume from the left side list and drag it to the Destination entry field.
    Select the source volume from the left side list and drag it to the Source entry field.
    Double-check you got it right, then click on the Restore button.
    Destination means the second internal drive. Source means the internal startup drive.

  • General question about iTunes Match and multiple libraries

    Hello to everyone,
    I have a general question about the iTunes Match service, which is available since yesterday in my country (Italy). Currently my library situation is the following:
    Computer A (desktop, Windows 7): "big" iTunes library (about 20 GB), at the moment not associated with my Apple ID
    Computer B (MacBook Air 2011): "small" iTunes library (about 5 GB), associated with my Apple ID
    At the moment, both my iOS devices (iPhone 4 and iPad 2) are synchronized with the smaller library on the MacBook Air.
    Question is as follows: should I subscribe to iTunes Match, would it be possible to upload the "big" library (provided I associate it with my Apple ID) to iCloud while keeping my devices synchronized with the "small" one?
    Ideally, at the end of the day, the situation should be the following: both iOS devices with music from the small library + possibility of downloading songs from iCloud (coming from the big one). Is this possible?
    Maybe the question sounds stupid, but I want to be sure about this before paying for the service.
    Thanks a lot.

    Yes, you could also associate your larger library with iTunes match if you associated your Apple ID with it. However any purchases in the library made from another Apple ID will not be matched with iTunes much.
    If both libraries are part of iTunes match, then all your devices will see all of the content from both libraries, which content you choose to have on those devices and which you have accessible via iTunes match is entirely up to you.

  • Two questions about SG300 DHCP server

    Hi,
    I have two questions about the DHCP server on the SG300:
    On the Address Binding page, what does the "Declined" state mean? I have a NAS device that won't pull an address, and I think that the entry with a state of "Declined" corresponds to this device. It was previously pulling an address from a RV180, so the only difference is that it is now connected to the SG300. I worked around this by manually setting the address on the NAS device, but this won't scale if I run into a lot of other devices that can't pull an address.
    I configured a static address binding for a WAP321 and found that instead of pulling the configured address that it pulled a dynamic address. I checked the Address Binding page and see that the dynamic entry that corresponds with the WAP321 has a Client Identifier rather than a MAC address. I changed the static entry for the WAP321 to use the client identifier displayed in the dynamic entry, and now the WAP321 pulls the configured static address. Is this expected behavior?
    Thanks,
    Bob

    With the SX300/500 it is required the client identifier, it doesn't automatically insert it. If static DHCP is made on the switch and you didn't need client identifier, that is more or less fortunate behavior for you
    So to answer this question, the expected behavior is to configure client identifier for static DHCP entry.
    -Tom
    Please mark answered for helpful posts
    http://blogs.cisco.com/smallbusiness/

Maybe you are looking for

  • Can't activate windows vista

    I am trying to install Windows Vista Business (retail boxed) 64 bit.  The box didn't include 64 bit media and so I've downloaded it from technet. The install asks for the product key but it is not accepted "your product key cannot be validated. Revie

  • Extrernal Number Ranges for Handling Units in COWBPACK

    Dear Friends, I need to activate external number range for handling units in COWBPACK transaction. When I run COWBPACK, I don't get any field to enter Handling Unit Number. Can anybody suggest the way out. Regards, Harsh

  • No class found error in ESR Interface mapping ?

    Hi all , I am trying to add a java validation in my Interface mapping . When i am compiling it in eclipse it is working fine.But when i am exporting and using it in my IM it is giving error as TEst_210/test/validation/OldFileJava6; details: java.lang

  • Want to Install a Dictionary in Nokia 6120

    I formatted the memory card and lost all the installation of Unidic, builtin with Nokia 6120 Classic phone, can i get it from anyone or anywher, please help or is there any freeware version of dictionary

  • Online Usage Statistics

    This post is about online usage statistics Why are they not provided, when BT clearly has the information (it's provided in the "over the limit") e-mails that BT send? Why does BT continue to ignore (for at least the last 2 years) the several e-mails