`

网络与线程

 
阅读更多
常见的TCP端口号
FTP 20
Telnet 23
SMTP 25
Time 37
HTTP 80
HTTPS 443

//一般用下面的方法启动新线程,而不是继承Thread类(当然这也是合法的)
public static void main(String[] args){
       Runnable mt = new MyThread();//MyThread的对象引用也行
       Thread th = new Thread(mt);
       th.start();
}  
class MyThread implements Runnable
{
     public void run() {
        go();
     }
     public void go()
    {
        System.out.println("启动了");
    }
}


synchronized关键词来修饰方法使它每次只能被单一的线程存取。
每个对象都有锁,大部分时间都没有锁上,并且你可以假设有个虚拟的钥匙随侍在旁。对象的锁只会在同步化的方法上起作用。当对象有一个或多个同步化的方法时,线程只有在取得对象锁得钥匙时才能进入同步化的方法(进入其他方法不需要锁)。所以,如果对象有两个同步化的方法,就表示两个线程无法进入同一个方法,也表示两个线程无法进入不同的方法(因为钥匙只有一个)。

每个类也有一个锁,当要对静态方法做同步化时,java会使用类本身的锁。如果一个类有两个被同步化的静态方法,线程需要去得类的锁才能进入这些方法。

不能依靠线程优先级来维持程序的正确性,没有绝对的事,只能用来影响执行性能。

事实上同步化的规模可以小于方法全部,可以用synchronized来修饰一行或数行的指令而不必整个方法都同步化。代码如下
public void go()
{
  doStuff();
  synchronized(this)
  {
     f1();
     f2();
  }
}


同步化可能产生死锁:java没有处理死锁的机制
线程A进入foo对象的同步化的方法,拿着钥匙a,睡着
线程B进入bar对象的同步化的方法,拿着钥匙b
B想要进入A正在执行的方法,所以只好等。
A醒来后,要进入B正在执行的方法,但拿不到钥匙b,只好等
A,B一直在那等着对方的钥匙。。。

避免死锁,自己的看法:
1 可以设定一种机制,当发现有线程等待过长时,可以让其中一个线程“回滚”。
2 让所有的线程按照同样的顺序获得一组锁.这种方法消除了 X 和 Y 的拥有者分别等待对方的资源的问题.
3 将多个锁组成一组并放到同一个锁下
4 最重要的是,在编写代码前认真仔细地设计整个系统.多线程是困难的,在开始编程之前详细设计系统能够帮助你避免难以发现Java线程死锁的问题
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics