2023年7月19日,锁升级,网络编程

news2024/12/25 11:15:05

锁升级

锁的四种状态:无锁、偏向锁、轻量级锁、重量级锁(JDK1.6)

无锁:操作数据时不会上锁


偏向锁:会偏向于第一个访问锁的线程, 如果在运行过程中,只有一个线程访问加锁的资源,不存在多线程竞争的情况,那么线程是不需要重复获取锁的,这种情况下,就会给线程加一个偏向锁。

偏向锁的实现是通过控制对象Mark Word的标志位来实现的,如果当前是可偏向状态,需要进一步判断对象头存储的线程 ID 是否与当前线程 ID 一致,如果一致直接进入。


轻量级锁:当线程竞争比较激烈时,偏向锁就会升级称为轻量级锁,其他线程会通过自旋方式(空转)等待上一个线程释放锁


重量级锁:当线程的并发程度加剧,线程的自旋超过了一定次数,或者一个线程在自旋,又进来一个线程访问,轻量级锁就会升级成为重量级锁,重量级锁会把除了此时拥有锁的线程以外的线程都阻塞。

升级到重量级锁其实就是互斥锁了,一个线程拿到锁,其余线程都会处于阻塞等待状态 。

网络编程

  • Socket套接字

Socket 是 Java 网络编程中用于实现客户端和服务器之间通信的类。它提供了一种方法来建立客户端和服务器之间的连接,并通过读写流来进行数据的传输。

在客户端中,可以使用 Socket 对象来创建一个与服务器建立连接的套接字。通过指定服务器的主机名和端口号,Socket 对象会尝试与服务器建立连接。一旦连接成功,就可以使用相关的输入流和输出流来进行数据的读写。

在服务器端中,可以使用 ServerSocket 来监听指定的端口,一旦有客户端发起连接请求,ServerSocket 会返回一个 Socket 对象,表示与客户端建立的套接字连接。通过这个 Socket 对象,可以进行数据的读写和与客户端进行通信。

总结来说,Socket 类提供了一种机制,使客户端和服务器能够进行通信,通过读写流来交换数据。客户端和服务器可以使用 Socket 对象进行连接建立、数据传输和通信操作。


这是一个简单的用户端与服务器交互的示例:

package com.wz.Test;

import java.io.Serializable;

public class Message<T> implements Serializable {
    private String action;
    private T data;

    public Message(String action, T data) {
        this.action = action;
        this.data = data;
    }

    public String getAction() {
        return action;
    }

    public T getData() {
        return data;
    }
}
package com.wz.Test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    private ServerSocket serverSocket;

    public Server(int port) throws IOException {
        //构建了一个服务器的套接字对象,这个对象侦听的端口就是给定的端口
        serverSocket = new ServerSocket(port);
    }

    public void start() {
        while (true) {//死循环
            try {//等待客户端连接,如果没有客户端连接,代码就阻塞在这里了
                Socket client = serverSocket.accept();
                System.out.println("客户端来连接了");
                InputStream in = client.getInputStream();
                ObjectInputStream ois = new ObjectInputStream(in);
                Message<?> message = (Message<?>) ois.readObject();
                String action = message.getAction();
                System.out.println(action);
                Object data = message.getData();
                System.out.println(data);

            } catch (IOException | ClassNotFoundException e) {
                throw new RuntimeException(e);
            }
        }
    }
    public static void main(String[] args) {
        try {
            Server server = new Server(9000);
            server.start();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

这段代码是一个简单的服务器端程序,它监听指定端口并接受客户端的连接。

  1. 创建 ServerSocket 对象来监听指定的端口。
  2. 通过调用 accept() 方法来等待客户端的连接。一旦有客户端连接上来,accept() 方法会返回一个 Socket 对象,表示与客户端建立的套接字连接。
  3. start() 方法中,通过获取客户端连接的输入流,并创建相应的对象输入流来读取客户端发送过来的消息。这里使用了 ObjectInputStream 来读取 Message<?> 对象,然后通过 getAction()getData() 方法获取消息的操作和数据。
package com.wz.Test;

import java.io.*;
import java.net.Socket;

public class Client {

    public static void main(String[] args) {
        /*host的表示方式:
        localhost,127.0.0.1,IP地址
        构建一个客户端的套接字,这个套接字要去连接的是服务器套接字
        同IP来定位计算机,通过端口号来定位应用,套接字对象一旦创建成功
        也就是与服务器套接字连接上了*/
        try {
            Socket client = new Socket("localhost",9000);
            //发送信息,输出流
            OutputStream os = client.getOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(os);
            oos.writeObject(new Message<>("login","admin:123456"));
            oos.flush();
            client.shutdownOutput();//关闭输出通道,告诉服务器,信息已经传输完毕
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

这段代码是一个简单的客户端程序,它与上面的服务器端程序进行通信。

  1. 首先创建一个客户端的套接字对象 client,并通过指定服务器的主机名和端口号来进行连接。这里使用的是本地主机 “localhost”,端口号为 9000。

  2. 通过获取客户端套接字的输出流,并创建对象输出流来发送消息到服务器。使用 ObjectOutputStreamwriteObject() 方法向输出流写入消息对象,这里是一个 Message<> 对象。

  3. 调用 flush() 方法将缓冲区中的数据立即发送到服务器。

  4. 调用 client.shutdownOutput() 方法关闭输出通道,告诉服务器信息已经传输完毕。

通过运行以上的服务器端程序和客户端程序,可以建立起客户端与服务器端的连接,并进行消息的传输和交互。

结果:

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb+Vue分离项目实现增删改查

文章目录 前言数据库后端代码util 代码listener 代码filter 代码po 代码dao 层增删改查代码service 层增删改查代码controller 层增删改查代码 前端代码查询操作删除功能增加功能修改方法路由传参修改会话存储修改 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&…

Java037——多线程

当涉及到计算机操作系统中的并发执行时&#xff0c;进程和线程是两个核心概念。 一、程序(program) 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码&#xff0c;静态对象。 二、进程&#xff08;Process&#xff09; 进程&#xff0…

MD5数据加密方法

什么场景需要使用数据加密呢&#xff1f;比如秘密数据传输、用户密码加密存储等等 数据传输可使用密钥对的方式进行加密解密&#xff0c;使用签名方式验证数据是否可靠&#xff0c;而密码加密存储可使用MD5等一些算法对数据进行单向加密 一、MD5单向加密 1、百度说法&#x…

【基础统计学】带重叠差分置信区间的检验

一、说明 对于统计模式识别&#xff0c;需要从基本的检验入手进行学习掌握&#xff0c;本篇是对统计中存在问题的探讨&#xff1a;如果两个分布有重叠该怎么做。具体的统计学原理&#xff0c;将在本人专栏中系统阐述。 二、几个重要概念 2.1 什么是假设检验 假设检验是一种统计…

第二节 C++ 数据类型

文章目录 1. 概述1.1 数据类型的重要作用 (了解) 2. 数据类型2.1 什么是进制 ?2.1.1 存储单位 2.2 整数类型2.2.1 整数类型使用2.2.2 超出范围2.2.3 关键字 sizeof 2.3 实型(浮点型)2.3.1 setprecision()函数2.3.2 科学计数 (了解即可) 2.4 字符型2.4.1 字符型定义2.4.2 ASCII…

树-用Java托举

再讲完前面几个数据结构后&#xff0c;下面&#xff0c;我们开始对树进行一个讲解分析 树 引言 树是一种重要的数据结构&#xff0c;在计算机科学中有着广泛的应用。树是由节点和边组 成的非线性数据结构&#xff0c;具有层次结构和递归定义的特点。每个节点可以有多个子 节点…

【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

Yan-英杰的主 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 【粉丝福利】 【文末送书】 目录&#xff1a; 本书特色&#xff1a; 问题描述 报错信息如下 Description:An attempt…

Docker 命令(二)

查看 docker 版本信息 docker version #查看版本信息docker 信息查看 docker info Client:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)Server:Containers: 0 …

get请求传入[ ]这类字符 返回400错误解决

问题描述 使用get请求查询&#xff0c;传入特殊字符 []时&#xff0c;接口报错。 分析原因 高版本的tomcat&#xff0c;有个新特性&#xff1a; 严格按照RFC 3986规范进行访问解析&#xff0c;而 RFC3986规范定义了Url中只允许包含英文字母&#xff08;a-zA-Z&#xff09;、数…

【Python】数据分析+数据挖掘——Pandas中文件I/O操作

文章目录 前言1. 读入文本格式数据文件1.1 pd.read_csv实例 1.2 pd.read_table1.3 pd.read_excel实例 1.4 pd.read_sql 2. 保存数据文件2.1 保存数据文件到外部文件中2.2 保存数据文件到数据库中 结束语 前言 在数据分析和数据挖掘中&#xff0c;数据通常以文件的形式存储在磁…

静电消除风机风棒的工作原理

静电消除风机风棒的工作原理静电消除离子风机是一种专门用于消除静电的设备。静电是由于物体表面带有静电荷而引起的现象&#xff0c;容易导致尘埃吸附、静电放电等问题。静电消除离子风机通过释放负离子或正离子来中和空气中的静电荷&#xff0c;从而减少静电问题的发生。 静…

【基于CentOS 7的Rsync服务】

目录 一、概述 二、特性 1.快速 2.安全 3.应用场景 三、数据的同步方式 1.pull 2.push 四、rsync传输模式 1.本地传输 2.远程传输 3.守护进程 五、rsync应用 1.安装 2.监听端口 六、rsync命令 1.格式 1.1 作为远程命令 1.2 作为rsync服务 2.选项 3.举例 …

服务器数据恢复-ESX SERVER无法连接到STORAGE的数据恢复案例

服务器数据恢复环境&#xff1a; 某公司信息管理平台&#xff0c;数台VMware ESX SERVER虚拟机共享一台IBM某型号存储。 服务器故障&#xff1a; VC报告虚拟磁盘丢失&#xff0c;管理员ssh到ESX中执行fdisk -l命令查看磁盘&#xff0c;发现STORAGE已经没有分区表了。重启设备后…

2023-7-20-第二十一式访问者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

unity预制体打包

unity做好的预制体如果给别的工程使用&#xff0c;如果是单纯的ctrlcv会导致丢失引用&#xff0c;如材质信息等&#xff0c;我们可以将其打包好再导入给别的工程。 如打包这个cube&#xff1a; 点击Export&#xff0c;选择保存位置

【算法基础:搜索与图论】3.2 树与图的dfs和bfs

文章目录 例题846. 树的重心&#xff08;深度优先遍历 / 树形DP&#xff09;⭐⭐⭐⭐⭐&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#xff08;重要&#xff01;好题&#xff01;&#xff09;847. 图中点的层次 相关链接 要学会建树、建图的通用方法。…

【C++】C++ 11 新特性

文章目录 &#x1f4d5; ★ 右值引用 ★概念左值引用和右值引用的比较使用场景和意义移动构造左值引用的缺陷 完美转发属性丢失为什么会属性丢失解决方法 &#x1f4d5; 新的类功能默认成员函数default 和 delete 关键字 &#x1f4d5; lambda 表达式问题的提出概念函数对象和 …

nuxt获取地址栏(路由)参数

要获取的路由地址&#xff08;页面顶部地址栏&#xff09;&#xff1a;http://172.31.0.1:5353/judge-manage?id3694089482878918764&name%E6%B5%8B%E8%AF%95&judgeIde9IJWN5usmzbrtNC3zYSRtAcKu-M333h 1、获取域名或ip端口&#xff1a;172.31.0.1:5353 2、获取地址…

JMeter的使用方法

JMeter是开源软件&#xff0c;100%的使用Java语言来进行开发的&#xff0c;支持主流的协议&#xff08;HTTP,HTTPS,WebService,gRPC&#xff09;的API测试和性能测试,是一款非常优秀的测试工具软件。 java 语言编写的程序&#xff0c;程序要运行&#xff0c;对外运行的程序有两…

Windows 2012 R2 编辑ini文本遇到的编码问题

在编辑服务端配置文件时&#xff0c;发现对于ini文本文件&#xff1a; 需注意点一&#xff1a;如果另存为UTF-8保存的实际上格式是UTF-8-BOM编码格式&#xff1b; 但是两种格式是存在差异的&#xff1a; 因此造成在使用C#调用系统DLL读取文件时并未报错&#xff0c;但是当使用…