线程

基于复制的高可用

笑着哭i 提交于 2020-03-13 12:07:27
基于复制的高可用 热备份 热备份原理:是指master故障以后,热备份提供一个master的原备份的,且所有的客户端和slave都可以切换到热备份服务器上并继续工作。 需要解决的问题 1)故障发生以后,系统热备到master上,你正从一个新的master上进行复制,所以有必要将binlog的位置转换到热备份服务器上; 2)当slave故障以后转移到热备份slave,热备份slave可能实际上并没有包含原slave记录的所有更改; 3)当把修复的master带回配置中去,被修复的master中的二进制日志中有些更改可能没有离开过服务器。 解决方法 1)默认情况下slave执行的事件没有被记录到二进制文件中,如果这个slave是master的一个备份,这时会出现问题,master有必要发送给备份服务器的所有更改写入备份服务器的二进制中,,在my.cnf中添加一个选项log-slave-updates. 这个确保来自master并被执行的语句会被写入slave的二进制中 Log-slave-updates 2)切换时slave和备份服务器在完全相同的位置停止运行,然后把slave重定向到备份服务器上。 如果备份服务器超前slave。为了让slave赶上备份服务器并在正确的位置停止,使用 start slave until master_log_file=’master-bin.0009’

方法join()使用详解

最后都变了- 提交于 2020-03-13 11:34:12
  在 线程的常见方法 一节中,已经接触过join()方法的使用。   在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将早于子线程结束。这时,如果主线程想等子线程执行完成才结束,比如子线程处理一个数据,主线程想要获得这个数据中的值,就要用到join()方法了。方法join()的作用是等待线程对象销毁。   join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。   join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。 (其实join()中调用的是join(0))   join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。 源码如下: 方法join(long)的功能在内部是使用wait(long)来实现的,所以join(long)方法具有释放锁的特点。 public final void join()

线程同步和互斥的区别

半世苍凉 提交于 2020-03-13 11:09:35
互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。 同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。 互斥是一种特殊的同步。 所谓互斥,就是不同线程通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源。如不允许同时写 同步关系则是多个线程彼此合作,通过一定的逻辑关系来共同完成一个任务。一般来说,同步关系中往往包含互斥,同时对临界区的资源会按照某种逻辑顺序进行访问。如先生产后使用 总的来说,两者的区别就是: 互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。 同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。 lock与unlock方法,替换synchronized,这就是互斥锁的体现。消费者生产者模式就是同步锁的体现。 来源: https://www.cnblogs.com/baizhanshi/p/6844356.html

Java 虚拟机的内存结构

蹲街弑〆低调 提交于 2020-03-13 05:38:33
Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行的管理(如何分配和回收内存空间)。 运行时数据区通常包括以下这几个部分: 程序计数器(Program Counter Register)   程序计数器(Program Count Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。   由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。   如果线程正在执行的是一个Java方法

Java虚拟机--内存结构

筅森魡賤 提交于 2020-03-13 05:35:53
1.JVM是什么?    JVM:Java Virtual Mechinal(Java虚拟机).它是一个虚构的计算机,是通过在实际的计算机上模拟各种功能来实现的。JVM的主要工作是解释自己的指令集(字节码,如java源码编译成class文件在虚拟机上运行)并映射到本地的CPU指令集或OS的系统调用。Java语言跨平台的本质就是不同的操作系统使用不同的JVM映射规则,使其与操作系统无关,从而实现跨平台。 2.JVM的内存结构是什么样子?    Java虚拟机在运行Java程序的时候,会把它所管理的内存划分为若干个不同的数据区域,如图:        3.那么接下来每个数据区域都是做什么的呢?    (1).程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。尤其在多线程的情况下,尤为重要。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,即在任何一个确定时刻,一个处理器只会执行一条线程,当线程切换后就需要恢复到正确位置,因此,程序计数器要实现线程隔离,每个线程都有自己的专属的计数器。值得注意的是: 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。    (2).堆 : 此内存区域是Java虚拟机管理的最大一块内存,同时也是线程共有的,在虚拟机启动时创建

Synchronized和java.util.concurrent.locks.Lockde区别联系

南笙酒味 提交于 2020-03-13 02:02:57
1、Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用的时候JVM可以自动释放,但是Lock需要程序员在finally块中手动释放。 synchronize在同步资源上,首先线程A获得了该资源的锁,并开始执行,此时他想要操作此资源的程序就必须等待,如果线程A由于某种原因处理常时间的操作状态,那么其他线程就无法得到处理他么的任务,只能无限的等待。所以Lock机制很好的解决了这个问题。 condition(条件队列或者条件变量) 替代了Object监察方法的使用,condition中的方法如下: // 造成当前线程在接到信号或被中断之前一直处于等待状态。 void await() // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。 boolean await( long time, TimeUnit unit) // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。 long awaitNanos( long nanosTimeout) // 造成当前线程在接到信号之前一直处于等待状态。 void awaitUninterruptibly() // 造成当前线程在接到信号

java.util.concurrent.locks.LockSupport (讲得比较细)

自闭症网瘾萝莉.ら 提交于 2020-03-13 02:02:05
转载:http://my.oschina.net/readjava/blog/282882 要学习JAVA中是如何实现线程间的锁,就得从LockSupport这个类先说起,因为这个类实现了底层的一些方法,各种的锁实现都是这个基础上发展而来的。这个类方法很少,但理解起来需要花费一点时间,因为涉及了很多底层的知识,这些都是我们平时不关心的。 上源代码: package java.util.concurrent.locks; import java.util.concurrent.*; import sun.misc.Unsafe; public class LockSupport { private LockSupport() {} // Cannot be instantiated. // Hotspot implementation via intrinsics API private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long parkBlockerOffset; static { try { parkBlockerOffset = unsafe.objectFieldOffset (java.lang.Thread.class.getDeclaredField(

归纳一下:C#线程同步的几种方法

瘦欲@ 提交于 2020-03-13 00:50:44
我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态;或者你的程序需要访问一些外部资源如数据库或网络文件等。这些情况你都可以创建一个子线程去处理,然而,多线程不可避免地会带来一个问题,就是线程同步的问题。如果这个问题处理不好,我们就会得到一些非预期的结果。   在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳。    一、volatile关键字   volatile是最简单的一种同步方法,当然简单是要付出代价的。它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我。(【转自 www.bitsCN.com 】)因此,当多线程同时访问该变量时,都将直接操作主存,从本质上做到了变量共享。   能够被标识为volatile的必须是以下几种类型:(摘自MSDN) Any reference type. Any pointer type (in an unsafe context). The types sbyte, byte, short, ushort, int, uint, char, float, bool. An enum type with an enum base type of byte, sbyte, short,

学习笔记1:java多线程机制之线程概念

筅森魡賤 提交于 2020-03-13 00:39:38
由于种种需求,今天开始由浅入深的学习java的多线程机制,而java语言的一大特性点就是内置对多线程的支持。 以下内容出自: http://blog.csdn.net/jiangwei0910410003/article/details/19962627 : 线程的生命周期: 1.新建状态(New):用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 2.就绪状态(Runnable):当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态。处于这个状态的 线程位于可运行池中,等待获得CPU的使用权 3.运行状态(Running): 处于这个状态的线程占用CPU,执行程序的代码 4.阻塞状态(Blocked): 当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到 运行状态。 阻塞状态分为三种情况: 1)、 位于对象等待池中的阻塞状态:当线程运行时,如果执行了某个对象的wait()方法,java虚拟机就回把线程放到这个对象的等待池中 2)、 位于对象锁中的阻塞状态,当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他的线程占用,JVM就会把这个线程放到这个对象的琐池中。 3)、 其它的阻塞状态:当前线程执行了sleep()方法

sleep()和yield()有什么区别?

不羁的心 提交于 2020-03-13 00:25:40
sleep() 方法给其他线程运行机会时 不考虑线程的优先级 ,因此会给低优先级的线程以运行的机会; yield() 方法只会给 相同优先级或更高优先级的线程 以运行的机会; 线程执行 sleep() 方法后转入阻塞 ( blocked )状态,而执行 yield() 方法后转入就绪 ( ready )状态; sleep() 方法声明抛出 InterruptedException ,而 yield() 方法没有声明任何异常; sleep() 方法 比 yield() 方法(跟操作系统相关)具有 更好的可移植性 。 来源: oschina 链接: https://my.oschina.net/u/4143249/blog/3192958