网络与线程

常见的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线程死锁的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值