java多线程。以线程安全的方式共享数据

时间:2017-09-13 21:18:03

标签: java multithreading thread-safety synchronized static-variables

我正在用java编写TCP套接字应用程序,我有点怀疑如何以线程保存方式进行。
在此示例中,静态方法startServer(int port)创建一个被动TCP套接字。在main中,我等待传入连接,这将通过专用线程进行管理。

首先,我真的很想了解线程之间的相互作用。

  

让A,B两个同一个类的实例:

     
      
  1. A的实例属性不是来自B;
  2.   
  3. 从A和B都可以看到静态属性。
  4.         

    让T1,T2两个同一类的线程:

         
        
    1. 属性可见性是否与使用的方式相同   实例?换句话说,只能共享静态属性   线程?
    2.   
    3. 非静态属性始终是线程安全的吗?
    4.   

在这个代码线程安全吗?

import java.io.*;
import java.net.*;
import java.util.*;

public class MultithreadServer extends Thread 
    {
     private Socket client;
     private String nonStaticAttribute;
     private static volatile Vector<String> clientsVector;

     public MultithreadServer(Socket c, String enc)
        {client = c;
         nonStaticAttribute = new String("val=" + Math.random());}

    /** create a passive socket*/
    public static ServerSocket startServer() throws BindException, IOException
        {clientsVector= new Vector<String>();}

    public void run()
        {

        try
            {
            MultithreadServer.clientsVector.addElement(clientName); // Does this variable shared in a thread-safe way between threads? Vector in internally Synchronized
             while(true)
                {
                /** does this line print a different values for each thread? (the value that was assigned in the costructor?)
                Or all thread will display the same value (the value of the costructor of the last thread ? ) */
                System.out(nonStaticAttribute);
                Thread.sleep(1000);}
            }
        catch(IOException e)
            {}
            }
        }

    /** main */
    public static void main(String[] argv) throws IOException
        { // Start del server
        myClass.startServer();
        myClass t1 = new myClass();
        t1.start();
        myClass t2 = new myClass();
        t2.start();
        ....
        myClass tn = new myClass();
        tn.start();
        }   

    }

如果我已经正确理解,locals实例属性是线程安全的,因为它们有自己的状态(在这种情况下,多个线程像多个istances一样独立工作)。
在我看来,静态Vector的使用也是线程保存,但仅仅因为Vector是内部同步的。

如果我使用像文件一样的非同步资源呢?

public class myClass extends Thread {
    // same code as the other example
    private final static File file = new File("rubrica.txt");

    void run() {
    .....
    synchronized (file)
        {FileWriter fout= new FileWriter(file,true);
         fout.write("add some content at the end");
         fout.flush();
         fout.close();
        }
    }

我真的很感激任何帮助。
祝你今天愉快!)

0 个答案:

没有答案