Java Synchronized method…not synchronized

后端 未结 3 661
时光取名叫无心
时光取名叫无心 2021-01-21 12:14

For my current java exercise, I have to get mail from 2 different gmail accounts. I have done this by creating new instances of my gmail class. The gmail class extends thread, a

相关标签:
3条回答
  • 2021-01-21 12:43

    When you synchronize readMail() as a method, then only one thread at a time can access the Objects readMail() method. If you have two different object instances of type GMail with a readMail() method, two threads can access them both unsynchronized (in parallel).

    In other words, the semaphor that block execution of the readMail() method is in fact the GMail object. With two different object instances, you have two semaphores which do not interact.

    It would work if you had only one instance of a GMail object with a synchronized readMail() method. Then only one thread at a time could access it.

    0 讨论(0)
  • 2021-01-21 12:44

    The synchronized keyword goes on the method the thread calls, not the method in the thread.

    So, your readMail method, which is defined in your thread, must call some other method that all your threads use, that is defined somewhere else, and you synchronize that method.

    So create a class

    public class MailHelper {
       public static void synchronized doRead(store) throws MessagingException, IOException {
           // all your readMail code here, except pass in the store
       }
    }
    

    and in your thread class

    public void readMail() throws MessagingException, IOException {
        // get your store
         MailHelper.doRead(store);
    }
    

    Note you can make the method on MailHelper not be static, then you would have to create an instance of the MailHelper and pass it to your threads.

    0 讨论(0)
  • 2021-01-21 12:59

    you should synchronize your method on an object both threads have access to, because right now you are using the object instance you are in to synchronize which of cause will never have an effect because both Threads only stay inside their on scope as far as I understand your question. You could pass an simple Object to both threads at their creation and reformat your method like this

    passing object to synchronize:

    public static void main(String[] args){
         Object obj = new Object();
         gmail g1 = new gmail(obj);
         gmail g2 = new gemail(obj);
         // more code
    }
    

    save reference in gmail class:

    public class gmail extends Thread{
        private Object sharedObject;
    
        public gmail( Object synchronizer){
              sharedObject = synchronzier;
        }
    

    synchronize on it:

    public void readMail(){
       synchronized( sharedObject ){
           // your method code goes here
       }
    }
    

    For this Example synchronizing on the class object of gmail is also possible and is even more easy

    public void readMail(){
       synchronized( this.getClass() ){
           // your method code goes here
       }
    }
    
    0 讨论(0)
提交回复
热议问题