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. (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

    1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...

  2. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

  3. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  4. 网络编程[第三篇]基于tcp协议实现远程连接

    需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息 一.服务端 —— 控制输出信息 import socket import subprocess #socket实例化 ...

  5. 线程的同步机制:同步代码块&同步方法

    解决存在的线程安全问题:打印车票时出现重票,错票 使用同步代码块的解决方案 TestWindow2 package com.aff.thread; /* 使用实现Runnable接口的方式,售票 存在 ...

  6. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  7. Qt基于tcp协议网络编程

    基于Qt网络编程: 基于tcp协议 c/s模式编程 所需要的类:QTcpServer QTcpSocket 利用qt基于tcp协议编写c/s模式程序: 两个类中的信号: QTcpServer : ne ...

  8. 基于TCP协议网络编程

    1.TCP/IP是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路: 一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路来进行通信: 2.Java对基 ...

  9. 【TCP/IP网络编程】:04基于TCP的服务器端/客户端

    摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...

随机推荐

  1. 文件触发式实时同步 Rsync+Sersync Rsync+Inotify-tools

    一.概述 1.Rsync+Sersync 是什么? 1)Sersync使用c++编写基于inotify开发的触发机制: 2)Sersync可以监控所监听的目录发生的变化(包括新建.修改.删除),具体到 ...

  2. T-sql 编程

    ---------------------------T-SQL编程--------------------------1.声明变量--declare @name nvarchar(50)--decl ...

  3. 前端(九):react生命周期

    一.组件渲染 当组件的props或者state发生改变时,组件会自动调用render方法重新渲染.当父组件被重新渲染时,子组件也会被递归渲染.那么组件是如何渲染的呢? # 方案一 1.state数据 ...

  4. 深入理解MyBatis的原理(三):配置文件(上)

    前言:前文提到一个入门的demo,从这里开始,会了解深入 MyBatis 的配置,本文讲解 MyBatis 的配置文件的用法. 目录 1.properties 元素 2.设置(settings) 3. ...

  5. JSP学习笔记(5)-Java Servlet

    1.什么是Servlet? Servlet(Servlet Applet),全程Java Servlet,是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态WEB内容.侠义 ...

  6. Qt程序Release版出现 类似 QEventLoop: Cannot be used without QApplication 问题的终极解决方案

    最近在做Qt程序开发,程序在Debug下跑是没有问题的,发布到Release版本后,出现各种问题: 报各种莫名其妙的错误,类似的错误有:   QEventLoop:Cannot be used wit ...

  7. c#中表达式的返回值是啥?

    今天在学javascript的时候发现它其中有一个语法是这样的(a="haha).length;这样也能够输出haha这个字符串的长度,然而我在使用c#的时候分行读取txt文本的时候也用这个 ...

  8. LOJ#6491. zrq 学反演(莫比乌斯反演 杜教筛)

    题意 题目链接 Sol 反演套路题? 不过最后一步还是挺妙的. 套路枚举\(d\),化简可以得到 \[\sum_{T = 1}^m (\frac{M}{T})^n \sum_{d \ | T} d \ ...

  9. css过渡笔记

    3D     http://fangyexu.com/tool-CSS3Inspector.html <!DOCTYPE html> <html lang="en" ...

  10. PM、oSE、oMDE、oTSE、oTC角色职责