线程

千峰逆战班 Day28生存日记

主宰稳场 提交于 2020-03-12 05:15:47
Question12 2020.3.11 1.一个单CPU的机器,如何同时执行多个线程? 单CPU在任何时间点上,只能运行一个进程,宏观并行、微观串行。单CPU单核中线程只能并发,单CPU多核中线程可以并行。 2. 3.C 4.A 5. 6.加入synchronized使得线程安全,只有拥有互斥锁标记的线程,才能进入对该对象加锁的同步代码块。线程退出同步代码块时,释放了相应的互斥锁标记。其他线程才可执行。 没有加入时,线程同时抢占CPU资源,输出的结果会不连续。 7.C 课堂案例 来源: CSDN 作者: weixin_42043566 链接: https://blog.csdn.net/weixin_42043566/article/details/104804773

java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)

倖福魔咒の 提交于 2020-03-12 05:14:43
上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题。我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // TODO Auto-generated method stub while(true){ if(ticket > 0){//当线程0被调起的时候,当执行到这条判断语句的时候,线程1被调起抢了CPU资源,线程0进入冻结状态。 try { Thread.sleep(100);//中断当前活跃的线程,或者执行的线程 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在卖票"+ticket--); //System.out.println(Thread.currentThread().getId()); //System.out.println(Thread.currentThread().getName()); } } } 分析: 当100张票卖到剩余最后1张的时候,也就是ticket=1的时候,有三个线程Thread-0, Thread-1,Thread-2,这时候, Thread-0进入if(ticket > 0

多线程(线程安全问题)

徘徊边缘 提交于 2020-03-12 05:14:17
这里以买票为例: 继承Thread的第一种创建线程的方法,不易满足多个线程共享一块数据资源的需求。 所以采用实现Runnable接口的第二种方法来创建线程。 class Ticket implements Runnable{ private int num = 100; public void run() { sale(); } public void sale (){ while(true){ if(num > 0) { try{Thread.sleep(10);}catch(InterruptedException e){} System.out.println(Thread.currentThread().getName()+"****"+num); num --; } } } } class ThreadDemo { public static void main (String[] arg){ Ticket d = new Ticket(); Thread t1= new Thread(d); Thread t2 = new Thread(d); Thread t3 = new Thread(d); Thread t4 = new Thread(d); t1.start(); t2.start(); t3.start(); t4.start(); } }

多线程-生产者消费者(synchronized同步)

我的未来我决定 提交于 2020-03-12 04:58:46
正解博客:https://blog.csdn.net/u011863767/article/details/59731447 永远在循环(loop)里调用 wait 和 notify,不是在 If 语句 现在你知道wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用,下一个一定要记住的问题就是,你应该永远在while循环,而不是if语句中调用wait。因为线程是在某些条件下等待的——在我们的例子里,即“如果缓冲区队列是满的话,那么生产者线程应该等待”,你可能直觉就会写一个if语句。但if语句存在一些微妙的小问题,导致即使条件没被满足,你的线程你也有可能被错误地唤醒。所以如果你不在线程被唤醒后再次使用while循环检查唤醒条件是否被满足,你的程序就有可能会出错——例如在缓冲区为满的时候生产者继续生成数据,或者缓冲区为空的时候消费者开始小号数据。所以记住, 永远在while循环而不是if语句中使用wait!我会推荐阅读《 Effective Java 》,这是关于如何正确使用wait和notify的最好的参考资料。 有的这样说:(http://www.tuicool.com/articles/a6ram23) 因为在多核处理器环境中, Signal 唤醒操作可能会激活多于一个线程(阻塞在条件变量上的线程),使得多个调用等待的线程返回

Java多线程(八)——join()

这一生的挚爱 提交于 2020-03-12 04:01:31
一、join()介绍 join() 定义在Thread.java中。 join() 的作用: 让“主线程”等待“子线程”结束之后才能继续运行。 这句话可能有点晦涩,我们还是通过例子去理解: // 主线程 public class Father extends Thread { public void run() { Son s = new Son(); s.start(); s.join(); ... } } // 子线程 public class Son extends Thread { public void run() { ... } } 说明 : 上面的有两个类Father(主线程类)和Son(子线程类)。因为Son是在Father中创建并启动的,所以,Father是主线程类,Son是子线程类。 在Father主线程中,通过new Son()新建“子线程s”。接着通过s.start()启动“子线程s”,并且调用s.join()。 在调用s.join()之后,Father主线程会一直等待,直到“子线程s”运行完毕;在“子线程s”运行完毕之后,Father主线程才能接着运行。 这也就是我们所说的“join()的作用,是让主线程会等待子线程结束之后才能继续运行”! 二、join()源码分析 public final void join() throws

mysql主从原理

眉间皱痕 提交于 2020-03-12 03:32:59
1.1 mysql主从同步    参考博客: https://www.cnblogs.com/kevingrace/p/6256603.html   1、mysql主从同步(复制)概念       1. 将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一遍来实现的。       2. 复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。       3. 主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。       4. 当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。       5. 从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。        binlog: 是二进制日志文件,用于记录mysql的数据更新或者潜在更新(比如DELETE语句执行删除而实际并没有符合条件的数据)   2、Mysql支持哪些复制       1. 基于语句的复制: 在主服务器执行SQL语句,在从服务器执行同样语句。        注: MySQL默认采用基于语句的复制,效率较高。一旦发现没法精确复制时, 会自动选基于行的复制。       2. 基于行的复制: 把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持       3.

Windows Internals 笔记——线程调度

孤街浪徒 提交于 2020-03-12 03:25:22
1.线程内核对象中的CONTEXT反应了线程上一次执行时CPU寄存器的状态。大约每隔20ms,Windows都会查看所有当前存在的线程内核对象。Windows在可调度的线程内核对象中选择一个,并将上次保存在线程上下文中的值载入CPU寄存器。这一操作被称为上下文切换。Windows实际上会记录每个线程的运行次数。 2.调用CreateProcess或者CreateThread时,系统将创建线程内核对象,并把挂起计数初始化为1。这样就不会给这个线程调度CPU了,因为线程初始化需要时间,我们不想再线程准备好之前就开始执行它。在线程初始化之后,CreateProcess或者CreateThread函数将查看是否有CREATE_SUSPENDED标志传入,如果有,函数返回并让新的线程处于挂起状态。如果没有,函数会将线程的挂起计数递减为0,线程就成为可调度的了。 3.通过创建一个处于挂起状态的线程,我们可以在线程执行任何代码之前改变它的环境(比如优先级)。之后可以调用ResumeThread函数使其变为可调度的,如果调用成功会返回线程的前一个挂起计数,否则返回0xFFFFFFFF。 4.还可以调用SuspendThread来挂起线程,任何线程都可以调用这个函数挂起另外一个线程(只要有线程句柄)。显然线程可以将自己挂起,但是它无法自己恢复。SuspendThread返回线程之前的挂起计数

想成为顶尖 Java 程序员?先过了下面这些问题!

丶灬走出姿态 提交于 2020-03-11 20:05:18
作者:rowkey https://zhuanlan.zhihu.com/p/31552882 一、数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度。 用Java写一个冒泡排序算法 描述一下链式存储结构。 如何遍历一棵二叉树? 倒排一个LinkedList。 用Java写一个递归遍历目录下面的所有文件。 二、Java基础 接口与抽象类的区别? Java中的异常有哪几类?分别怎么使用? 常用的集合类有哪些?比如List如何排序? ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和优缺点? 内存溢出是怎么回事?请举一个例子? ==和equals的区别? hashCode方法的作用? NIO是什么?适用于何种场景? HashMap实现原理,如何保证HashMap的线程安全? JVM内存结构,为什么需要GC? NIO模型,select/epoll的区别,多路复用的原理 Java中一个字符占多少个字节,扩展再问int, long, double占多少字节 创建一个类的实例都有哪些办法? final/finally/finalize的区别? Session/Cookie的区别? String/StringBuffer/StringBuilder的区别,扩展再问他们的实现? Servlet的生命周期? 如何用Java分配一段连续的1G的内存空间

Windows进程解析

守給你的承諾、 提交于 2020-03-11 19:56:28
Windows进程解析 进程是程序在计算机上的一次执行活动。运行一个程序时,就启动了一个进程。相对而言,程序是一组代码,是静态的,进程是代码的执行行为,是活的。 在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。 windows重要系统进程详解 Winlogon 是一个登录/退出进程。winlogon在用户按下CTRL+ALT+DEL时激活,并显示安全对话框。该进程提供了登录所需的类型控制和输入口令所需的对话框。当你输入用户名和口令时,Winlogon将其发送给一个叫做LSASS的子进程。如果你执行对服务器或工作站的本地登录,LSASS进程将在安全数据库(亦即SAM)中查对有关用户名和口令。Winlogon有两个子进程,即服务控制器和LSASS。 Explorer进程 在Windows系列的操作系统中,运行时都会启动一个名为Explorer.exe的进程。这个进程主要负责显示系统桌面上的图标以及任务栏。 csrss.exe进程 这个进程是用户模式Win32子系统的一部分,CSRSS代表客户/服务器运行子系统而且是一个基本的子系统必须一直运行。CSRSS负责控制Windows图形相关子系统,创建或者删除线程和一些16位的虚拟MS-DOS环境。 System Idle 这个进程不可以从任务管理器中关掉,是作为单线程运行在每个处理器上

什么是信号量?

折月煮酒 提交于 2020-03-11 19:51:12
信号量是一种编程概念,经常用于解决多线程问题。 我对社区的问题: 什么是信号量,如何使用? #1楼 因此,想象每个人都在尝试去洗手间,而洗手间只有一定数量的钥匙。 现在,如果没有足够的键,该人需要等待。 因此,可以将信号量视为代表可用于浴室(系统资源)的那些键集,以供不同进程(浴室行进者)请求访问。 现在想象一下试图同时去洗手间的两个过程。 那不是一个好情况,并且使用信号量来防止这种情况。 不幸的是,信号量是一种自愿机制,过程(我们的洗手间)可以忽略它(即,即使有钥匙,仍然有人可以将门打开)。 二进制/互斥量和计数信号量之间也存在差异。 在 http://www.cs.columbia.edu/~jae/4118/lect/L05-ipc.html上 查看讲义。 #2楼 构建并发程序有两个基本概念-同步和互斥。 我们将看到这两种类型的锁(信号灯通常是一种锁定机制)如何帮助我们实现同步和互斥。 信号量是一种编程结构,可通过实现同步和互斥来帮助我们实现并发。 信号量有两种类型,二进制和计数。 信号量包括两个部分:一个计数器和一个等待访问特定资源的任务列表。 信号量执行两项操作:wait(P)[就像获取锁一样],以及release(V)[类似于释放锁] –这是一个可以对信号量执行的仅有的两项操作。 在二进制信号量中,计数器在逻辑上介于0和1之间。您可以认为它类似于具有两个值的锁:打开