CAS算法:
- 在修改共享数据的时候,把原来的旧值记录下来
- 如果在内存中的值跟原来的旧值一样,证明没有其他线程操作过内存值,则修改成功
- 如果内存中的值跟原来的旧值不一样了,证明已经有其他线程操作过内存值了
- 则修改失败,需要获取现在最新的值,再次进行操作,这个重新获取的就是自旋。
Hsatable
1、Hashtable采取悲观锁synchronized的形式保证数据的安全性
2、只要有线程访问,会将整张表全部锁起来,所以Hashtable的效率低下。
- HashMap线程不安全的,多线程环境下会有数据安全问题
- Hashtable是线程安全的,但是会将整张表锁起来,效率低下
- ConcurrentHashMap也是线程安全的,效率较高
1. 7 ConcurrentHashMap
1. 8 ConcurrentHashMap
1、如果使用空参构造创建ConcurrentHashMap对象,则什么事情都不做
在第一次添加元素的时候创建哈希表
2、计算当前元素应存入的所引
3、如果该索引位置为null,利用cas算法,将本节点添加到数组中
4、如果该索引位置不为null,则利用volatile关键字获得当前位置最新的结点地址,挂在他下面,变成链表
5、当链表的长度大于等于8时,自动转换成红黑树
6、以链表或者红黑树头结点为锁对象,配合悲观锁保证多线程操作集合时数据的安全性。
网络编程概述
网络编程
- 在网络通信协议,不同计算机运行的程序,可以进行数据传输
网络编程三要素
IP地址
- 设备在网络中的地址,是唯一标识的
端口
- 应用程序在设备中唯一标识
- 一个端口号只能被一个应用程序使用
端口号:用两个字节表示的整数,它取值0~65535
其中0~1023之间的端口号用于一些知名的网络服务或者或者应用
协议
- 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议
协议:计算机网络中,连接和通信的规则被称为网络通信协议
UDP协议 - 用户数据报协议(User Datagram Protocol)
- UDP是面向无连接通信协议
速度快、有大小限制一次最多发送64K,数据不安全,易丢失数据
TCP
- 传输控制协议
- TCP协议是面向连接的通信协议
- 速度慢、没有大小限制、数据安全
InetAddress的使用
为了方便对IP地址的获取和操作,Java提供了一个类InetAnddress
InetAddress: 此类表示Internet协议(IP)地址
package com.socketdemo1;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetadressDemo1 {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("梅赛德斯");
String hostName = address.getHostName();
System.out.println("主机名为 ;" + hostName);
String ip = address.getHostAddress();
System.out.println("IP "+ip);
}
}
UDP发送端
package com.socketdemo2;
import java.io.IOException;
import java.net.*;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//找码头
DatagramSocket ds = new DatagramSocket();
//打包礼物
String s = "送给村长的礼物";
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
//由码头发送包裹
ds.send(dp);
//付钱走羊
ds.close();
}
}
UDP接收数据
TCP通信原理
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象。
通信之前要保证连接已经建立。
通过Socket产生IO流来进行网络通信。
TCP发送数据
package com.socketdemo6;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建一个Socket对象
Socket socket = new Socket("127.0.0.1", 10000);
//获取一个IO流开始写数据
OutputStream os = socket.getOutputStream();
os.write("hello".getBytes());
//释放资源
os.close();
socket.close();
}
}
TCP接收数据
package com.socketdemo6;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建Socket对象
ServerSocket ss = new ServerSocket(10001);
//等待客户连接
System.out.println(111);
Socket accept = ss.accept();
System.out.println(222);
//获得输入流对象
InputStream is = accept.getInputStream();
int b;
while ((b = is.read()) != -1) {
System.out.print((char) b);
}
//释放资源
is.close();
ss.close();
}
}
- accept方法是阻塞的,作用就是等待客户端连接
- 客户端创建对象并连接服务器,此时是通过三次握手协议保证跟服务器之间的连接
- 针对客户端来讲,是往外写,所有是输出流
- 针对服务器来讲,是往里读的,所以是输入流
- read方法也是阻塞的
- 在关流的时候,还多了一个往服务器写结束标记的动作
- 最后一步断开连接,通过四次挥手协议保证连接终止
三次握手
四次挥手
网络编程:就是可以让两台计算机进行数据交互
网络编程三要素:
IP : 设备在网络中唯一标识
端口号:应用程序在设备中唯一的标识
协议:数据在传输过程中遵守的规则