自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 资源 (3)
  • 收藏
  • 关注

原创 Java使用Condition控制线程通信

一点睛当使用Lock对象来保证同步时,Java提供了一个Condition类来保持协调,使用Condition可以让那些已经得到Lock对象、却无法继续执行的线程释放Lock对象,Condtion对象也可以唤醒其他处于等待的线程。Condition 将同步监视锁方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与Lock对象组合使用,为每个对象...

2019-05-30 21:41:03 236

原创 Java线程协调运行

一点睛借助于Object类提供的wait()、notify()和notifyAll()三个方法,可实现Java线程协调运行。这三个方法并不属于Thread类,而是属于Object类。但这三个方法必须同步监视器对象调用。关于这三个方法的解释如下: wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。该wait()...

2019-05-29 21:50:21 291

原创 Java中死锁实战

一点睛当两个线程相互等待对方释放同步监视器时就会发生死锁,Java虚拟机没有监测、也没有采用措施来处理死锁情况,所以多线程编程时应该采取措施避免死锁的出现。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。二代码class A{ public synchronized void foo( B b ) { ...

2019-05-28 21:42:17 304

原创 使用锁解决银行取钱问题

一点睛1释放同步监视器线程会在如下几种情况下释放对同步监视器的锁定: 当前线程的同步方法、同步代码块执行结束,当前线程即释放同步监视器。 当线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行,当前线程将会释放同步监视器。 当线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致了该代码块、该方法异常...

2019-05-28 21:40:45 635

原创 同步方法解决银行取钱的安全问题

一点睛与同步代码块对应,Java的多线程安全支持还提供了同步方法,同步方法就是使用synchronized关键字来修饰某个方法,则该方法称为同步方法。对于synchronized修饰的实例方法(非static方法)而言,无须显示指定同步监视器,同步方法的同步监视器是this,也就是调用该方法的对象。通过使用同步方法可以非常方便地实现线程安全的类,线程安全的类具有如下特征。 该类的对...

2019-05-28 21:38:41 581

原创 同步代码块解决银行取钱的安全问题

一点睛为了解决类似银行取钱这类安全问题,Java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法是同步代码块。同步代码块的语法格式是:synchronized(obj){ //此处代码块就是同步代码块。}上面语法格式中种的obj就是同步监视器,上面代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。任何时刻只能由一个线程获得对...

2019-05-28 21:36:29 286

原创 银行取钱线程安全问题

一定义一个账户类public class Account{ // 封装账户编号、账户余额的两个成员变量 private String accountNo; private double balance; public Account(){} // 构造器 public Account(String accountNo , dou...

2019-05-26 15:15:00 581

原创 Java改变线程优先级

一点睛每个线程在执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。每个线程默认的优先级都与创建它的父线程的优先级相同,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级。二 代码public class PriorityTest extends Thread{ // 定义一个有参数的...

2019-05-26 14:50:33 3218 1

原创 Java的线程让步yield

一点睛yield()方法是一个和sleep()方法有点类似的方法,它是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是让线程转入就绪状态。yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()方法后,线程调度器又将其调度出来重新执行。当某个线程调用了yield方法暂停之后,只有优先级...

2019-05-26 14:40:21 426 1

原创 Java的线程睡眠sleep

一点睛如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过Thread类的静态方法sleep()方法来实现。当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep()中的线程也不会执行,因此sleep()方法常用来暂停程序的执行。二代码public class SleepTe...

2019-05-26 11:32:22 8773

原创 Java的后台线程

一点睛有一种线程,它是后面运行的,它的任务是为其他线程提供服务,这种线程被称为“后台”线程,又称为“守护线程”或“精灵线程”。JVM的垃圾回收线程就是典型的后台线程。后台线程有个特征:如果所有的前台线程都死亡,后台线程会自动死亡,调用Thread对象的setDaemon(true)方法可将指定线程设置成后台线程,所有的前台线程都死亡时,后台线程随之死亡。当整个虚拟机中只剩下后台线程时...

2019-05-26 11:12:35 3809 2

原创 Java中join线程

一点睛Tread提供了让一个线程等待另外一个线程完成的方法——join()方法。当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完后为止。join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。当所有小问题都得到处理后,再调用主线程来进一步操作。二代码public cla...

2019-05-26 10:14:34 188

原创 线程的运行状态说明

一线程状态转换图二线程状态变迁说明1当发生如下情况时,线程将主动进入阻塞状态。 线程调用sleep()方法主动放弃所占用的处理器资源。 线程调用了一个阻塞式IO方法,在该方法返回之前,该线程将被阻塞。 线程试图获得一个同步监视器,但该同步监视器正在被其他线程所持有。 线程正在等待某个通知(notify) 程序调用了线程的suspend...

2019-05-26 09:56:48 368

原创 线程的新建和就绪状态

一点睛当线程被创建启动以后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建、就绪、运行、阻塞和死亡5种状态。当线程启动后,它不可能一直霸占CPU独自运行,所以CPU需要在多个线程之间切换,于是线程状态也会多次在运行和就绪之间切换。当程序使用new关键字创建一个线程后,该线程就处于新建状态。当线程对象调用start()方法之后,该线程就处于就绪状...

2019-05-26 09:31:10 1303

原创 使用Callable和Future创建线程

一点睛从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。 call()方法可以有返回值。 call()方法可以声明抛出异常。 创建并启动线程的步骤如下:1创建Callable接口的实现类,并实现call()方法...

2019-05-26 09:00:53 4325

原创 实现Runnable接口创建线程类

一点睛实现Runnable接口来创建并启动线程的步骤如下:1定义Runnable接口的实现类,重写该接口的run()方法,该run()方法的方法体是该线程的线程执行体。2创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。3调用线程对象的start()方法来启动该线程。二代码//...

2019-05-26 08:30:26 9038

原创 继承Thread类创建线程类

一点睛通过继承Thread类创建线程并启动多线程的步骤:1定义Thread的子类,并重写该类的run()方法,该run()方法的方法体代表了线程需要完成的任务。因此run()方法称为线程执行体。2创建Thread子类的实例,即创建子线程对象。3调用线程对象的start()方法来启动该线程。二代码// 通过继承Thread类来创建线程类public class ...

2019-05-24 21:46:02 6386

原创 探秘Java虚拟机

一点睛不论是用控制台模式,还是Eclipse、Java编译器——javac,都会将源代码编译成 .class这样的字节码文件,这样的文件,并不能如同可执行文件一样,双击就能执行,而是必须通过java命令,将 .class文件送往Java虚拟机(JVM),通过JVM的解释而完成程序的执行,在这其中,JVM扮演着很重要的作用。JVM可看作是机器和编译程序之间加入了一层抽象的虚拟机器。这...

2019-05-21 21:46:37 245

原创 Java的环境变量ClassPath详解

一点睛该变量是用来告诉Java解释器(即java命令)在哪些目录下可找到所需要执行的class文件(即javac编译生成的字节码文件)。ClassPath指定的是java加载类的路径。只有类在ClassPath中,java命令才能找到它,并解释它。二实战——在命令行配置ClassPath1将HelloWorld.class放到D盘下。2在D盘下执行下面命令D:\&...

2019-05-20 22:17:18 7597

原创 IPerf开源代码中Socket类

一点睛Socket的定义和实现分别在文件Socket.hpp和Socket.cpp。它的主要功能是封装socket文件描述符、此Socket对应的端口号以及socket接口中的listen、accept、connect和close等函数,为用户提供了一个简单易用而又同一的接口。同时作为其他派生类的基类。二类定义class Socket {public: // sto...

2019-05-19 16:35:17 480

原创 IPerf开源代码中SocketAddr类分析

一点睛SocketAddr类定义在lib/SocketAddr.hpp中,实现在lib/SocketAddr.cpp中。SocketAddr类封装了网络通信中经常用到的地址结构以及在这些结构上进行的操作。地址解析也是在SocketAddr的成员函数中完成的。sockaddr用来表示网络地址中的通用数据结构。sockaddr_in用来表示TCP/IP地址的数据结构。两个结构...

2019-05-19 14:59:54 319

原创 IPerf开源代码中Thread类分析

一点睛Tread类封装了POSIX标准中的多线程机制,提供了一种简单易用的线程模型。Thread类是IPerf实现中比较重要的类,是IPerf实现多线程并行操作的核心。二Thread类的定义1类定义于lib/Thread.hpp中,其实现位于lib/Thread.cpp中。class Thread {public: Thread( void ); virt...

2019-05-19 14:12:30 483

原创 IPerf源代码概述

一点睛1IPerf是用C++实现的。2IPerf运用了面向对象的思想进行建模,主要用到了Linux系统编程中的Socket网络编程和多线程编程,因此可以从IPerf开源代码中学习到面向对象编程、Socket网络编程以及多线程编程技术。3从最简单的1.7.0版本的源代码开始学习。4代码结构如下src目录[root@localhost src]# tree.├─...

2019-05-19 09:45:39 3159 2

原创 IPerf简单使用

一点睛1IPerf是一个服务器/客户端运行的程序2在服务器端运行iPerf,也需要在客户端运行IPerf。3服务器端,在命令行下使用iperf加参数-s。4客户端,在命令行下使用iperf加参数-c。5经过一段时间测试(默认10秒),在Server端和Client端就会打印出网络连接的各种性能参数。二实战1准备服务器和客户端服务器:192.168.0...

2019-05-19 08:55:26 8988

原创 iPerf简介

一点睛二IPerf的主要功能1TCP测量网络带宽 报告MSS/MTU值的大小和观测值 支持TCP窗口值通过套接字缓冲 当P线程或Win32线程可用时,支持多线程。客户端与服务端支持同时多重连接2UDP客户端可以创建指定带宽的UDP流 测量丢包 测量延迟 支持多播 当P线程可用时,支持多线程三在Linux下安装IPerf1官网https://...

2019-05-19 08:30:40 1620

原创 服务器和端口端TCP交互图解

一TCP状态转换图二TCP的各种状态 状态 说明 CLOSED 没有连接,表示初始状态 LISTEN 表示服务器端的某个socket处于监听状态,可以接收连接。服务端收到被动打开,等待SYN SYN_SENT 客户端socket...

2019-05-18 15:46:32 1458 1

原创 Valgrind检测内存管理错误

一点睛常见的内存分配方式分3种:静态存储、栈上分配、堆上分配。全局变量属于静态存储,它在编译时就被分配了存储空间;函数内的局部变量属于栈上分配;而最灵活的内存使用方式当属于堆上分配,也叫内存动态分配。常用的内存动态分配函数包括:malloc 、alloc、realloc、new等,动态释放函数包括free和delete等。一旦成功申请了动态内存,就需要自己对其进行内存管理,而这又是最...

2019-05-18 10:38:17 1900

原创 Valgrind检测内存覆盖

一点睛C语言的强大和可怕之处在于其可以直接操作内存,C标准库中提供了大量这样的函数,比如strcpy、strncpy、memcpy、strcat等,这些函数有一个共同的特点就是需要设置源地址和目的地址,且src和dst指向地址不能发生重叠,否则结果将不可预期。二内存覆盖的例子#include<stdio.h>#include<stdlib.h>#inc...

2019-05-18 10:21:37 814 1

原创 Valgrind检测内存读写越界

一点睛内存读写越界是指访问了没有权限访问的内存地址空间,比如访问数组时越界,对动态内存访问超出了申请时内存的大小范围。二内存读写越界例子#include<stdlib.h>#include<iostream>using namespace std;int main(){ int len=4; int *pt=(int *)malloc...

2019-05-18 10:10:22 3647

原创 Valgrind检测使用未初始化的内存

一点睛对于位于程序中的不同段的变量,其初始值是不同的,全局变量和静态变量初始值为0,而局部变量和动态申请的变量,其初始值为随机值。如果程序使用了为随机数的变量,那么程序的行为就变得不可预期了。二错误代码#include<iostream>using namespace std;int main(){ int a[5]; int i,s=0; ...

2019-05-18 10:01:14 2534

原创 Valgrind检测非法访问内存

一代码#include<iostream>#include<stdlib.h>using namespace std;void func(){ int *x=(int *)malloc( 10 * sizeof ( int ) ) ; x[10]=0;}int main(){ func(); cout<<"don...

2019-05-18 09:49:37 667

原创 Valgrind介绍和安装

一点睛Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示Valgri...

2019-05-18 09:30:02 230

原创 Linux程序内存空间布局以及实战

一典型内存空间布局1代码段(.txtt segment):代码段通常是指存放程序执行代码的一块内存区域。2初始化数据段(.data segment):通常是指用来存放程序已初始化的全局变量的一块内存区域。3未初始化数据段(.bss segment):通常是用来存放程序未初始化的全局变量的一块内存区域。4堆(heap):堆是用于存放进程运行中被动态分配内存段,它的大小并...

2019-05-17 21:56:13 577

原创 ps命令实战

一代码#include<iostream>#include<unistd.h>using namespace std;int main(){ for(int i=0;i<100;i++){ cout<<"i:"<<i<<endl; sleep(5); } retu...

2019-05-14 21:51:39 176

原创 top命令详解

一点睛top命令是Linux下最常用的性能分析工具,能够实时显示系统各个进程的资源占有状态,类似Windows的任务管理器。二实战[root@localhost charpter05]# toptop - 18:10:19 up 3:31, 1 user, load average: 0.00, 0.01, 0.05Tasks: 93 total, 1 runni...

2019-05-12 20:32:46 285

原创 gdb定位coredump文件实战——非法访问内存

一代码#include <stdio.h>int main(){ int b=1; int* a; a=NULL; *a=b; return 0;}二编译并运行# 编译[root@localhost charpter05]# g++ -g -o test 0505.cpp# 查看core存放目录[root@local...

2019-05-12 17:42:24 995

原创 用gdb分析coredump文件

一基本概念gdb可以用于分析coredump文件。core文件又称为coredump文件。当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(...

2019-05-12 17:14:17 4478

原创 gdb调试实战

一代码#include<iostream>using namespace std;int func(int n){ int result=0; for(int i=1;i<=n;i++){ result+=i; } return result;}int main(){ int arr[10]; arr...

2019-05-12 15:41:30 506

原创 strace调试程序实战

一代码#include <iostream> #include <fstream> #include <stdlib.h>using namespace std; int main(){ char buffer[256]; ifstream in("input.txt"); if (! in.is_open()...

2019-05-12 15:06:13 413

原创 strace调试的常用方法

一将strace结果输出到文件1格式-ofilename或 2>filename2实战[root@localhost charpter05]# strace -c -o test.txt ./test88[root@localhost charpter05]# strace -c ./test 2>test2.txt88[root@localh...

2019-05-12 14:55:42 1399

2 shiro身份认证.mp4

身份验证介绍了身份验证基础、principals、credentials、身份认证流程、Realm、多 Realm 配置以及相关实战。

2020-05-19

1 shiro简介.mp4

Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,在此分享给大家!

2020-05-19

Java单选.docx

常见Java单选题,

2019-12-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除