Check auf thread-safety



  • Hallo,

    ich hätte mal eine Frage, da ich seit längerem aus Threads 'rausbin, bzw. nie ernsthaft damit gearbeitet habe, würde ich gerne fragen ob man Methoden auf Thread-safety prüfen kann?

    Mein Ansatz in dem ich prüfe ob printstacktrace thread safe ist:

    public class Printstacktrace extends Thread{
    
    	int function(int a,int b)
    	{
    		int c=0;
    		try
    		{
    			c=a/b;
    		}
    		catch(Exception ex)
    		{
    			ex.printStackTrace();
    		}  
    
    		return c;
    	}
    
    	public void run()
        {	
    
        }
    
    	public static void main(String[] args) 
    	{
    
    		Printstacktrace p1 = new Printstacktrace();
    		Printstacktrace p2 = new Printstacktrace();
    
    		p1.start();
    		p1.function(20, 10);
    		p1.function(23, 0);
    		p2.start();
    		p2.function(30, 20);
    		p2.function(40, 0);
    	}
    }
    

    Dank um jede Hilfe!

    Mfg



  • Dir ist schon klar, dass von den neuen Threads nur das ausgeführt wird, was in der run()-Methode steht? Im Moment wird bei dir alles nur vom main-Thread ausgeführt.



  • Zur Frage:
    Man kann Programme (und natürlich auch Programmteile) auf thread safety prüfen. Allerdings nicht über Programme sondern über formale, mathematische Beweise.
    (Oftmals reicht es auch etwas darüber nachzudenken. Es ist aber nicht einfach parallel zu denken).

    Aber mit Programmcode kannst du die Korrektheit nicht überprüfen.



  • Sieht's so etwas besser aus?

    Ich sehe aus dem folgenden Code nur, dass, die Threads unterschiedlich gestartet werden (zeitlich), aber sehe nicht ob System.out, oder printStacktrace
    synchronized sind.

    Ist wirklich ein math. Beweis notwendig?
    Also ich habe bisher keinen Programmierer gesehen der Methoden mathematisch beweist mit Stift und Zettel.

    public class Printstacktrace extends Thread{
    
        static Printstacktrace p1 = new Printstacktrace();
        static Printstacktrace p2 = new Printstacktrace();
    
        int function(int a,int b,String str)
        {
            int c=0;
            try
            {
                c=a/b;
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }  
            System.out.println(str);
            return c;
        }
    
        public void run()
        {
            p1.function(20, 10,"Thread1");
            p1.function(23, 0,"Thread1");
    
            p2.function(30, 20,"Thread2");
            p2.function(40, 0,"Thread2");
        }
    
        public static void main(String[] args)
        {
            p1.start();
            p2.start();
        }
    }
    

Anmelden zum Antworten