Day 21 03.22
死锁(了解)
相互等待
1线程锁1资源
2线程锁2资源
1线程再去锁2资源
2线程再去锁1资源
死锁:
1、主要指在多个线程执行中,因争夺资源而造成互相等待的现象。若没有外部处理,他们都将无限的等待下去。(相互将对象锁起来)
原因:
1、系统的资源不足
2、进程的推进顺序有问题
3、资源分配不当
死锁的案例
系统中有两个对象 A\B
线程1:对A加锁 ---- 对B加锁 — 执行 — 释放B —释放A线程2 :对B加 — 对A加锁 —执行 — 释放A — 释放B
==========================================
代码示范
锁A之后需要睡眠100;
线程数据共享(了解)
在java中,可使用wait、notify、notifyall完成线程间的通信。在开发中最常见的例子就是生产者和消费者的问题,生产者生产产品通知消费者去消费产品。生产者将产品放入到队列里面,消费者就可以从队列里面获取数据,如果没有数据那就等待
wait、notify、notifyall
都属于Object对象提供,主要用来控制线程状态
wait
该方法是用来将一个线程置入休眠的一个方法。不会自己恢复,必须等待调用notify、notifyall当前线程才能被唤醒
调用wait的时候,线程必须要获取到对象的对象级别锁。(wait必须在synchronized中间用),一旦调用了wait,当前线程就处于休眠状态,当前线程就释放,其他线程可以抢资源。
notify
唤醒在此对象监视器下面等待的单个线程。(也就是notify唤醒 使用了wait休眠的线程,操作本对象的线程),如果有多个线程在此对象上等待,会随机唤醒一个线程,并等待获取对象的对象锁(等待获取的意思,表示当前就算收到了通知,wait对象也不会马上获取对象锁,notify唤醒的线程执行完了才能获取对象锁)。
代码示范:
notifyall
唤醒当前对象上面阻塞的所有线程,唤醒的时候顺序是随机的。要注意的地方是使用notifyall的时候必须在synchronized内部完成。
总结
1、总结 sleep和wait区别
2、总结notify和notifyall的区别
3、说一下哪个时候用sleep哪个时候用wait
状态 声明周期 阻塞 同步 死锁 同步共享
============================================
java网络编程
osi参考模型
tcp/ip参考模型
scoket 套接字 封装好的下三层 传输层、网络层、物理层
tcp协议
tcp:传输控制协议 基于字节流的传输层通信协议
两个类 :Socekt 和ServerSocekt
可靠、双向、持续、点对点
第一次握手表示建立连接,客户端发送SYN=1包到服务器,ACK
=0,seq=x
SYN:表示建立连接,ACK=0暂时没有收到响应,seq:声明自己的序号,x是客户端随机生成
进入发送状态,等待服务器确认
第二次握手:服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入接受状态。
SYN=1 ACK=1 服务器已经接受成功,开始响应,seq=y服务器生成的序号,ack=x+1(客户端需要处理后再发回去)
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入一建立状态,完成三次握手
ACK=1,seq=x+1,ack=y+1
Scoket:
网络编程也是只scoket编程,scoket在表示插座
两个应用程序可以通过双向的网络通信连接实现一个数据交换的过程。双向连接的一端就称为scoket。
java。net包下面提供了两个主要的类scoket、serverscoket分别用来实现双向连接的客户端-服务器
建立连接的时候需要用到的寻址信息就是IP地址(端口)
一个应用程序可以占用多个端口,但是一旦被占用其他应用程序就不能使用该端口。
自己编写的程序要设置端口至少要设置1024以上的端口,1024以前的端口系统随时要征用