(1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型
1.线程的同步机制(重点)
1.1 基本概念
当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制。
如:
2003年左右 银行卡业务 存折 对应同一个账户
1.2 解决方案
由程序结果可知:当两个线程同时进行取款操作时,会导致最终的账户余额不正确。
引发原因:线程一还没有完成取款操作时,线程二就已经开始执行。
解决方案:等线程一执行完毕取款后再执行线程二,将线程的并发操作修改为串行操作即可
带来问题:多线程串行执行会造成执行的效率比较低,因此建议能不用则尽量不要用, 并且锁定的代码范围应该越小越好。
1.3 实现方式
在Java语言中使用synchronized关键字来实现线程的同步,叫做同步锁/对象锁,具体实现方式如下:
(1)使用同步语句块的方式实现
synchronized(对象的引用){
编写所有需要锁定的代码块;
}
(2)使用同步方法的方式实现,也就是让synchronized关键字修饰整个方法;
该方式等价于synchronized(this){}的方式,推荐使用该方式
1.4 实现原理
多个线程启动后同时抢占共享资源,当其中一个线程抢到共享资源后则进行加锁处理,此时其它线程只能进入阻塞状态,直到该线程执行完毕所有锁定代码后则自动释放对象锁,此时阻塞状态的线程再次抢占共享资源,抢到的线程加锁去执行,抢不到的线程继续保持阻塞。
1.5 死锁(了解)
线程一执行的代码:
public void run(){
synchronized(a){ => 线程一已经持有对象锁a,等待对象锁b
synchronized(b){
...;
}
}
}
线程二执行的代码:
public void run(){
synchronized(b){ => 线程二已经持有对象锁b,等待对象锁a
synchronized(a){
...;
}
}
}
建议:
在以后的开发中尽量不要使用同步语句块的嵌套结构。
1.6 Object类中的常用方法
void wait() - 用于让当前线程进入等待状态,直到其它线程调用notify()
或notifyAll()方法之前。
void wait(long timeout) - 用于让当前线程进入等待状态,等待参数指定的毫秒数。
void notify() - 用于唤醒等待的单个线程。
void notifyAll() - 用于唤醒等待的所有线程。
2.网络编程的常识
目前主流的网络通讯软件有:微信、QQ、陌陌、YY、飞信、阿里旺旺、...
在吗?
2.1 七层网络模型(熟悉)
ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
当发送数据时,需要按照上述七层从左向右依次进行加包处理,然后再发送出去;
当接收数据时,需要按照上述七层从右向左依次进行拆包处理,然后再显示出来;
2.2 常见的协议(熟悉)
协议 - 本质上就是一种约定,用于规定通信双方需要遵循的规则。
http协议 - 超文本传输协议,主要用于浏览网页。
ftp协议 - 文件传输协议,主要用于上传和下载文件。
tcp协议 - 传输控制协议,主要用于进行数据的传输和通信。
udp协议 - 用户数据报协议,主要用于进行数据的传输和通信。
ip协议 - 互联网协议,是上述协议的底层协议。
... ...
2.3 IP地址(重点)
如:
192.168.1.1 - 是绝大多数路由器的登录地址,可以进行Mac地址的绑定/过滤。
IP地址是互联网中的唯一地址标识,本质上是由32位二进制组成的整数,叫做ipv4,当然也有128位二进制组成的整数,叫做ipv6,目前的主流还是ipv4。
日常生活中采用点分十进制表示法进行IP地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的十进制整数之间采用小数点分隔。
如:
0x01020304(十六进制) => 1.2.3.4
查看IP地址的方式:
Windows系统的dos窗口中使用命令 ipconfig 或者 ipconfig/all 查看
Linux系统的终端窗口中使用命令 ifconfig 或者 /sbin/ifconfig 查看
2.4 端口号(重点)
IP地址 - 可以定位到具体某一台设备中。
端口号 - 可以定位到具体某一个进程中。
网络编程需要提供: IP地址 + 端口号。
端口号本质上是由16位二进制组成的整数,表示的范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此编程从1025开始使用。
3.基于tcp协议的编程模型(重中之重)
3.1 编程模型
服务器:
(1)创建ServerSocket类型的对象,并提供端口号(大插排);
(2)等待客户端的连接请求,调用accept()方法;
(3)使用输入输出流进行通信;
(4)关闭Socket并释放有关的资源;
客户端:
(1)创建Socket类型的对象,并提供服务器的IP地址和端口号(充电器);
(2)使用输入输出流进行通信;
(3)关闭Socket并释放有关的资源;
(1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型的更多相关文章
- (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型
1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...
- (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制
1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 网络编程[第三篇]基于tcp协议实现远程连接
需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息 一.服务端 —— 控制输出信息 import socket import subprocess #socket实例化 ...
- 线程的同步机制:同步代码块&同步方法
解决存在的线程安全问题:打印车票时出现重票,错票 使用同步代码块的解决方案 TestWindow2 package com.aff.thread; /* 使用实现Runnable接口的方式,售票 存在 ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- Qt基于tcp协议网络编程
基于Qt网络编程: 基于tcp协议 c/s模式编程 所需要的类:QTcpServer QTcpSocket 利用qt基于tcp协议编写c/s模式程序: 两个类中的信号: QTcpServer : ne ...
- 基于TCP协议网络编程
1.TCP/IP是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路: 一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路来进行通信: 2.Java对基 ...
- 【TCP/IP网络编程】:04基于TCP的服务器端/客户端
摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...
随机推荐
- 一个形式较精细的Strling公式的证明
近日整理书稿,在整理至Strling公式处时,发现当时数学老师所讲的是形式比较精细的一种: Strling公式:\(n!=\sqrt{2\pi n}\left(\dfrac{n}{\mathrm{e} ...
- IOS开发常见第三方总结
链接](https://github.com/languages/Objective-C/most_watched) * [three20](https://github.com/facebook ...
- for in可遍历原型链上扩展的属性,Object.keys() 只遍历自身属性
一.for in 1.使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问: Object.prototype.say="cgl"; // 修改Object.pr ...
- pictureBox控件获得图片路径的三种方法及自适应大小属性
1.绝对路径: this.pictureBox2.Image=Image.FromFile("D:\\001.jpg"); 2.相对路径: Application.StartupP ...
- SQL Server附加数据库拒绝访问解决方法汇总
@本文来自百度 方法一:修改权限法 1 打开要附加的数据库文件所在的文件夹,即扩展名为mdf的文件所在的文件夹,如下图所示: 2 右键单击mdf文件,选择“属性”,如下图所示: 3 单击“安全”选项卡 ...
- Java中Date与String的相互转换
我们在注册网站的时候,往往需要填写个人信息,如姓名,年龄,出生日期等,在页面上的出生日期的值传递到后台的时候是一个字符串,而我们存入数据库的时候确需要一个日期类型,反过来,在页面上显示的时候,需要从数 ...
- ASP.NET Core依赖注入
一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Con ...
- VS本地调试 Visual Studio远程调试监视器(MSVSMON.EXE)的32位版本不能用于调试64位进程或64位转储
vs2017 调试一致都没啥问题,今天莫名报这个错误,感觉好奇怪,网上搜索了半天也没解决,最后看着错误信息感觉很诡异,我本地调试你给我启动远程调试监测器干嘛,localhost也访问不了,ping了一 ...
- marquee 滚动到文字上时停止滚动,自定义停止方法
我要实现的效果如下图:当鼠标移到续费提醒文字上时,文字滚动停止,并出现后面的关闭按钮:当鼠标移出文字时,文字继续滚动,后面的关闭按钮不显示. 在网上查到的marquee停止滚动的的代码是这样的: &l ...
- Vue 2.0 pagination分页组件
最近写了一个分页组件,效果如下图: f-pagination.js文件 Vue.component('f-pagination',{ template:'<div class="fPa ...