Java网络编程socket-线程的同步、网络编程、tcp协议

今天内容: (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型

1.线程的同步机制(重点)

1.1 基本概念

多个线程同时访问同一种共享资源时,可能会造成数据的覆盖等不一致性问题,此时就需要进行线程之间的通信和协调,该机制就叫线程的同步机制。

2003年 存折 和 银行卡 对应同一个账户
第一个DEMO(DEMO1)代码

1.2 解决方案

由程序结果可知:当两个线程同时进行取款时,导致最终的账户余额不合理
引发原因:线程一还没有执行完毕取款操作,此时线程二已经开始取款操作
解决方案:让两个线程的并发操作改为串行操作即可,也就是依次执行取款操作
方案的缺点:若依次启动多个线程则导致多线程的意义不复存在。

1.3 实现方式

在这里插入图片描述
在这里插入图片描述
在Java语言中使用synchronized关键字实现同步/对象锁机制,来保证线程执行该段代码时的原子性(要么不执行,要么就执行完整),具体方式如下:
(1)使用同步语句块的方式来锁定部分代码;
synchronized(任意类型的引用){
编写需要锁定的代码;
}
代码实现:DEMO2的代码
(2)使用同步方法的方式来锁定所有代码;
1:如果this可以锁住,那么关键字也可以锁住,如果this锁不住,关键字也锁不住;this是可变的
2:对于成员方法来说,this关键字表示当前正在调用的对象 t1
代码实现:DEMO3的代码
在这里插入图片描述
注意:一个文件中可以有多个类

1.4 原理分析

多个线程调用start方法同时抢占共享资源,由于同步锁的存在导致只有一个线程能够抢到共享资源并进行加锁处理,其它没有抢到共享资源的线程进入阻塞状态,当该线程执行完毕所有锁定的代码自动释放同步锁,此时阻塞状态的所有线程继续抢占共享资源抢不到的线程再次回到阻塞状态
举例:集体抢位,一个人抢到了就锁上门
在这里插入图片描述

1.5 死锁的概念

StringBuffer:线程安全就是同步。
StringBuilder:线程不是安全的,也不是同步的
在这里插入图片描述
在这里插入图片描述
死锁:锁死

线程一执行的代码:
public void run() {
synchronized(a) { 持有同步锁a,等待同步锁b
synchronized(b) {

}
}
}
线程二执行的代码:
public void run() {
synchronized(b) { 持有同步锁b,等待同步锁a
synchronized(a) {

}
}
}
经验分享:
在以后的开发中尽量少使用同步代码块的嵌套结构!
顺序上锁,反向解锁,不要回头
线程一执行的代码:
public void run() {
synchronized(a) { 持有同步锁a,等待同步锁b
synchronized(b) {

}
}
}
线程二执行的代码:
public void run() {
synchronized(b) { 持有同步锁b,等待同步锁a
synchronized© {

}
}
}
举例:
五个哲学家等待吃晚餐,桌上只有五支筷子,每个哲学家只抢到了一只筷子,每一个哲学家都不想放掉手中的筷子,就形成了死锁。怎么进行编译才能让每个哲学家都能吃到晚餐呢:
在这里插入图片描述

2.网络编程的常识

目前主流的网络通讯软件:微信、QQ、陌陌、探探、飞信、阿里旺旺、支付宝、…
在吗?

2.1 七层网络模型

在这里插入图片描述
举例:就像买手机一样,手机官方旗舰店将手机寄到你手里需要,给手机包装,然后寄过来。手机被发送过来的时候进行包装,你收到手机后需要拆包。
在这里插入图片描述

ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
发送数据时,需要对发送的内容按照上述七层模型进行层层加包再发送出去;
接收数据时,需要对接受的内容按照上述七层模型相反的次序层层拆包再解析出来

2.2 IP地址(重点)

MAC地址就是物理地址,只要你不换硬件就不会变
在这里插入图片描述

如:
192.168.1.1 - 是绝大多数路由器的登录地址,进行账号密码的配置以及Mac地址过滤

IP地址 - 是互联网中的唯一标识,用于定位到具体某一台设备。
IP地址本质上是由32位(四个字节)二进制组成的整数,叫做IPv4,当然也有128位(8个字节)二进制组成的整数,叫做IPv6,目前主流的还是IPv4.
日常生活中采用点分十进制表示法进行IP地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的十进制整数之间采用小数点隔开。
如:
0x01020304 => 1.2.3.4 ==》01算一位,02算一位。。。

2.3 端口号(重点)

在这里插入图片描述

IP地址 - 可以定位到具体某一台设备
端口号 - 可以 定位到具体某一个进程
网络编程需要提供:IP地址 + 端口号

端口号本质上是由16位二进制组成的整数,表示的范围:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此开发中从1025开始使用。

重点留意:IP地址找设备,端口号找进程

3.基于tcp协议的编程模型(重点)

3.1 编程模型

在这里插入图片描述
在这里插入图片描述

服务器:(serversocket类)

(1)创建ServerSocket类型的对象提供端口号
(2)等待客户端的连接请求,调用accept方法;
(3)使用输入输出流进行通信;
(4)关闭Socket;
在这里插入图片描述

客户端:(socket类)

(1)创建Socket类型的对象并提供服务器的IP地址和端口号;
(2)使用输入输出流进行通信;
(3)关闭Socket;
在这里插入图片描述
在这里插入图片描述

相关的类:

作业:

1.重点掌握线程同步的代码 和 基于tcp协议编程模型的代码。
2.使用基于tcp协议的编程模型实现将User类型的对象由客户端发送给服务器并打印。
其中User类的特征有:用户名、密码。
3.复习所有内容准备阶段考试。

作业代码:
https://shimo.im/docs/cCJjgrwCH63Yr8qG

搞定!!!

日子是自己的,要靠自己不断的摸索出属于自己的经验,什么所谓的大道理都是别人嘴里说出来的。要靠自己的经验,去走自己接下来的路。
加油,祝祝。step by step.

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Recently 祝祝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值