(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套接字(本 ...
随机推荐
- ios10系统以下原生传来的base64图片无法转化为二进制
最近在做和原生ios交互上传图片的时候,遇到原生传来的以base64图片位无法转化为二进制.因为前端上传图片的方式是以二进制的方式上传,在ios10 和安卓上,上传图片是可以的:在ios10以下,可以 ...
- NAS DAS SAN 磁带机 tco
部分摘录自: 百科:http://baike.baidu.com/link?url=7HOH3pJHfaxT-a01T0EhTZBnvvfMoyOZTthUbjMQM85LVxwfFP47YInuo1 ...
- 利用扩展方法重写JSON序列化和反序列化
利用.NET 3.5以后的扩展方法重写JSON序列化和反序列化,在代码可读性和可维护性上更加加强了. 首先是不使用扩展方法的写法 定义部分: /// <summary> /// JSON ...
- Java基础教程(17)--接口
就像类一样,接口也是引用类型.它可以包含常量,方法签名,默认方法,静态方法和嵌套类型.在接口中,只有默认方法和静态方法有方法体.但不同于类,接口无法实例化,它只能被类实现或被其他接口继承. 一.定 ...
- java并发编程的艺术(三)---lock源码
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- Docker部署golang微服务项目
这篇博客是为了记录一下部署步骤. 因为实训需要,我要在服务器上用docker部署我们小组的微服务项目.我们的微服务有Gateway,User,Scene,Device四个部分,分别占用不同的端口,其中 ...
- CodeForces765C
C. Table Tennis Game 2 time limit per test:2 seconds memory limit per test:512 megabytes input:stand ...
- 基于express+mongodb+pug的博客系统——后台篇
上一篇介绍了模板引擎pug.js的用法,这一篇就主要写后台逻辑了. 后台的大部分的功能都有了,只是在已经登录的状态下,前台和后台的逻辑处理还不是很完善. 先上几张图吧,仿旧版的简书,改了下UI,因为没 ...
- webapi 后台跳转 后台输出html和script
1.跳转 [HttpGet]public HttpResponseMessage LinkTo(){ HttpResponseMessage resp = new HttpResponseMessag ...
- Flink1.4.0中反序列化及序列化类变化
Flink1.4.0中,反序列化及序列化时继承的类,有一些被标记为了“@deprecated”,路径上也有变化: 1.AbstractDeserializationSchema 以前路径 org.ap ...