安全问题 例子:假设有三个窗口在卖票,票数一共有100张 问题:卖票过程中出现了重票,错票 -->出现了线程安全问题 原因:当某个线程在操作共享数据时,还未操作完,此时其他线程加入进来,也对共享数据进行了操作 解决方法:当线程a在操作共享数据时,其他线程不能参与,当线程a操作完毕之后,其他线程才能操作共享数据,即使线程a阻塞了也不会改变这种情况 --> 使用同步机制解决 public class Window implements Runnable{ private int ticket = 100; @Override public void run() { while (true) { if (ticket > 0) { System.out.println(Thread.currentThread().getName()+"卖票,票号为:"+ticket); ticket--; }else { break; } } } } public class WindowTest { public static void main(String[] args) { Win.... 线程安全问题 Java
1.继承Thread类 (1)创建一个继承与Thread类的子类 (2)重写Thread类的run()方法 (3)创建Thrad类的子类对象 (4)通过此对象调用start()方法 -> 启动线程,调用线程的run()方法 public class ThreadTest { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); } } class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { if (i%2 == 0) { System.out.println(i); } } } } Thread的常用方法 (1)start():启动当前线程;调用当前线程的run()方法 (2)run():通常需要重写Thread中的此方法,将创建的线程要执行的操作声明在此方法中 (3)currentThread():静态方法.... Java多线程的创建方式 Java
1.主题 Appearance&Behavior -> Appearance 2.设置鼠标滚轮修改字体大小 Editor -> General 3.设置鼠标悬浮提示 Editor -> General 4.自动导包功能 Editor -> General -> Auto Import 5.显示行号和分隔符 Editor -> General -> Appearance 6.忽略大小写提示 Editor -> General -> Code Completion 7.设置字体 Editor -> Font 8.设置字符集 Editor -> FileEncodings 9.开启自动编译 Bulid,Execution,Deployment -> Compiler IntelliJ IDEA常用配置 IntelliJIDEA
接口 除了定义全局常量和抽象方法之外,还可以定义静态方法,默认方法 //静态方法 public static void demo(){ } //默认方法,public可以省略 public default void show() { } (1)接口中定义的静态方法,只能用接口来调用 (2)接口中定义的默认方法可通过接口的实现类调用 (3)如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中同名同参数的方法 --> 类优先原则 Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 //常规写法 Comparator<Integer> comparable = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2).... JDK8新特性 Java
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 1.单例模式 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 (1)饿汉式 public class Singleton { //1.私有化的构造器 private Singleton() { } //2.内部创建类的对象 //4.要求此对象也必须声明为静态的 private static Singleton instance = new Singleton(); //3.提供公共的静态方法,返回类的对象 public static Singleton getInstance() { return instance; } } (2)懒汉式(线程不安全) public class Singleton { //1.私有化的构造器 private Singleton() { } //2.声明当前类的对象,没有初始化 //4.要求此对象也必须声明为静态的 private static Singleton instan.... 设计模式 Java
冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 原理: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 public static int[] BubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j.... 常见排序算法 Java
二分查找 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 public static void binarySearch(int[] arr, int target) { int start = 0; int end = arr.length - 1; boolean flag = true; while (start <= end) { int middle = (start + end) / 2; if (arr[middle] == target) { flag = false; System.out.println(middle); break; .... 常见查找算法 Java
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数 普通方式 Boolean flag = true; for (int i = 1 ; i <100; i++) { for (int j = 2 ; j < i; j++) { if ( i%j == 0) { flag = false; break; } } if (flag) { System.out.println(i); } flag = true; } 优化一 根据定理:如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根,可将判断范围缩小 Boolean flag = true; for (int i = 1 ; i <100; i++) { for (int j = 2 ; j < Math.sqrt(i); j++) { if ( i%j == 0) { flag = false; break; } } if (flag) { System.out.println(i); } flag = true; } 优化一(写法二) label: .... 求100以内的质数 Java
WebDriver Webdriver 是一个远程控制接口,支持用户代理的自检和控制。 它提供了一个平台和语言中立的连接协议,作为进程外程序远程指示 web 浏览器行为的一种方式。 提供了一组接口来发现和操作 web 文档中的 DOM 元素,并控制用户代理的行为。 它的主要目的是允许 web 作者编写测试,从一个单独的控制过程中自动化一个用户代理,但也可以用于允许浏览器内的脚本控制一个(可能是单独的)浏览器。 IE浏览器驱动下载地址:http://docs.seleniumhq.org/download/ Firfox浏览器驱动下载地址:https://github.com/mozilla/geckodriver/releases Chrome浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html Edge浏览器驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ 本人使用的是chrome,驱动版本与浏览器版本对应关.... 初探Java爬虫 Java
问题 在重置过服务器后通过ssh连接会出现如下错误 [root@VM_0_16_centos ~]# packet_write_wait: Connection to 49.233.171.80 port 22: Broken pipe wuruohuideMacBook-Pro:~ wuruohui$ ssh root@49.233.171.80 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible t.... Host key verification failed 学习笔记
POM依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency> 从数据库中验证信息并进行简单的权限验证 自定义UserDetail @Data public class User implements UserDetails { private Integer id; private String username; private String password; private Long gmtCr.... SpringSecurity简单使用 SpringBoot
开启 Docker 远程访问 1.修改配置 vim /lib/systemd/system/docker.service 将红框位置的修改为 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 2.重启守护进程 systemctl daemon-reload 3.重启 docker systemctl restart docker 4.验证是否成功 浏览器输入,返回当前的 images 信息 http://49.233.171.80:2375/images/json IntelliJ IDEA的配置 1.pom Docker插件 <properties> <docker.image.prefix>wuruohui</docker.image.prefix> </properties> <!-- docker插件 --> <build> <plugins> <plugin> .... IntelliJ IDEA实现Docker镜像部署 Docker
点击 springinit-> 到最后选择 Spring Web,spring2.1 以上的版本从 Web 选项变成了 Spring Web pom 文件 <dependencies> <!-- web启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId&.... SpringBoot SpringBoot
简介 Struts2 是一个基于 MVC 设计模式的 Web 应用框架,它本质上相当于一个 servlet,在 MVC 设计模式中,Struts2 作为控制器(Controller)来建立模型与视图的数据交互 历史 1.Model1:整个 Web 应用几乎全部由 JSP 页面组成,JSP 页面接受处理客户端请求,对请求处理后直接作出相应。用少量的 JavaBean 来处理数据库连接、数据库访问等操作。代码结构混乱,可重用性低 2.Model2(Servlet+JSP+JavaBean) 3.Struts1:线程不安全、灵活性低、和 ServletAPI 耦合、页面传值麻烦 4.Struts2(Apache Struts + OpenSymphony WebWork2):struts 的前身是 webwork,前身是 WebWork,与 Struts1 基本没关系 优势 1.自动封装参数 2.参数校验 3.结果的处理(转发 | 重定向) 4.国际化 5.显示待处理页面 6.表单的防止重复提交 核心 Struts2 的核心是拦截器 1.表面上看,拦截器帮我们封装了很多功能 2.拦截器优秀的.... Struts2 Struts2
标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 显示效果如下: 字体 *斜体* **加粗** ***斜体并加粗*** ~~删除线~~ 显示效果如下: 斜体 加粗 斜体并加粗 删除线 字体的颜色可以通过 HTML 代码来实现 <font color="red" face="楷体" size="2">字体颜色</font> 显示效果: 字体颜色 color:字体颜色 face:字体 size:字体大小,数值从 1 到 7 分割线 ****** ------ ______ 效果如下: 引用 > >> >>> 效果如下 引用 引用 引用 代码块 `行内式` 多行代码 效果如下: 行内式 void show() { System.out.println("多行代码"); } 列表 无序列表 这三个都可以表示无序列表,要对列表再进行划分。子列表时,细分的子列表与父列表至少要缩进两个空格,符号跟列表文字描述间要加一个空格 - 无序列表.... Markdown语法 Markdown
GitHub pages 搭建个人博客 目录 GitHub gitbash 本地部署 写博客 GitHub 创建 GitHub 账号 创建 GitHub 仓库 填写信息 gitbash Git 基础 Git 工作区域 工作区、暂存区、仓库 工作区--->暂存区:git add 文件 暂存区--->仓库:git commit -m "描述" 每一步都可以使用 git -status 查看状态,最后使用 git push 提交到远程仓库 git clone 仓库地址 这个命令可以克隆远程仓库到本地 Git 配置(下载地址) git config --global user.name "username" //GitHub用户名 git config --global user.email "email" //GitHub邮箱 git config --list //可以查看配置,查看里面的键值对是否正确 cd ~/.ssh //生成ssh令牌 mkdir key_backup ssh-keygen -t rsa -C "*youremail@address*".... GitHub pages 搭建个人博客 GitHubPage
UrlParm = function() { // url参数 var data, index; (function init() { data = []; index = {}; var u = window.location.search.substr(1); if (u != '') { var parms = decodeURIComponent(u).split('&'); for (var i = 0, len = parms.length; i < len; i++) { if (parms[i] != '') { var p = parms[i].split("="); if (p.length == 1 || (p.length == 2 && p[1] == '')) {// p | p= data.push(['']); index[p[0]] = data.length - 1; } else if (typeof(p[0]) == 'undefined' || p[0] == '') { // =c | = data[0] = [.... JavaScript获取url参数(转) JavaScript
GitHub APP 实现 GitHub 登录 注册 GitHub APP 登录 GitHub 后的操作步骤 1.创建一个 OAuth App 2.填写信息 3.创建成功后会给一个 Client ID 和 Cilent Secret,没人使用这个 APP 进行第三方登录的话,显示的是 0 user 登录流程 1.用户访问 BBS 2.点击登录,BBS 先执行自己的业务逻辑 3.调用 authorize 接口访问 GitHub 4.GitHub 回调一个 uri,携带 code 5.BBS 调用 access_token 接口携带 code 6.验证通过的话会返回一个真正的 token 7.使用 token 用 user 接口进行认证 8.返回用户信息 9.存入数据,更新登录状态 10.返回给用户登录成功的信息 User->>BBS: 1.访问 BBS->>BBS:2.登录 BBS->>GitHub:3.authorize GitHub->>BBS: 4.回调redirect-uri携带code BBS->>GitHub:.... Github APP实现github登录 学习笔记