摘要: 是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个 参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调 用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和 C#中可以 通过传引用或传输出参数来改变传入的参数的值。在 C#中可以编写如下所示的 阅读全文
posted @ 2020-06-07 23:53 咔啡 阅读(805) 评论(0) 推荐(0)
摘要: ConcurrentHashMap 的并发度就是 segment 的大小,默认为 16,这意味着最多同时可以有 16 条线程操作 ConcurrentHashMap,这也是ConcurrentHashMap 对 Hashtable 的最大优势,任何情况下,Hashtable 能同时有两条线程获取 H 阅读全文
posted @ 2020-06-07 23:39 咔啡 阅读(1761) 评论(0) 推荐(0)
摘要: 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的 现场保存都使用 JVM 中的栈空间;而通过 new 关键字和构造器创建的对象则放在 堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收 集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为 Ede 阅读全文
posted @ 2020-06-07 23:36 咔啡 阅读(783) 评论(0) 推荐(0)
摘要: 这里区分一下: 1、如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关 系,继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎 认为是一个无穷大的队列,可以无限存放任务 2、如果使用的是有界队列比如 ArrayBlocking 阅读全文
posted @ 2020-06-07 23:25 咔啡 阅读(9133) 评论(0) 推荐(0)
摘要: ThreadLocal 是 Java 里一种特殊的变量。每个线程都有一个 ThreadLocal 就是每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了。它是为创建代价高昂的对象获取线程安全的好方法,比如你可以用 ThreadLocal 让SimpleDateFormat 变成线程安全的,因为 阅读全文
posted @ 2020-06-07 23:21 咔啡 阅读(982) 评论(0) 推荐(0)
摘要: Executors 工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务 的需求。 Executor 接口对象能执行我们的线程任务。 ExecutorService 接口继承了 Executor 接口并进行了扩展,提供了更多的方法我 们能获得任务执行的状态并且可以获取任务的返回值。 使用 T 阅读全文
posted @ 2020-06-07 23:13 咔啡 阅读(1187) 评论(0) 推荐(0)
摘要: 当一个线程需要调用对象的 wait()方法的时候,这个线程必须拥有该对象的锁,接 着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的 notify() 方法。同样的,当一个线程需要调用对象的 notify()方法时,它会释放这个对象的 锁,以便其他在等待的线程就可以得到这个对象锁。由于 阅读全文
posted @ 2020-06-07 23:11 咔啡 阅读(1222) 评论(0) 推荐(0)
摘要: ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。简单说 ThreadLocal 就是一种以空间换时间的做法,在每个 Threa 阅读全文
posted @ 2020-06-07 23:08 咔啡 阅读(1565) 评论(0) 推荐(0)
摘要: CyclicBarrier 可以重复使用,而 CountdownLatch 不能重复使用。 Java 的 concurrent 包里面的 CountDownLatch 其实可以把它看作一个计数器, 只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器, 也就是同时只能有一个线程去减这 阅读全文
posted @ 2020-06-07 23:05 咔啡 阅读(263) 评论(0) 推荐(0)
摘要: 当一个线程进入 wait 之后,就必须等其他线程 notify/notifyall,使用 notifyall,可 以唤醒所有处于 wait 状态的线程,使其重新进入锁的争夺队列中,而 notify 只能 唤醒一个。 如果没把握,建议 notifyAll,防止 notigy 因为信号丢失而造成程序异常 阅读全文
posted @ 2020-06-07 22:50 咔啡 阅读(1033) 评论(0) 推荐(0)
摘要: 修饰符 当前类 同 包 子 类 其他包 public √ √ √ √ protecte d √ √ √ × default √ √ × × private √ × × × 类的成员不写访问修饰时默认为 default。默认对于同一个包中的其他类相当于公 开(public),对于不是同一个包中的其他类 阅读全文
posted @ 2020-06-07 22:44 咔啡 阅读(523) 评论(0) 推荐(0)
摘要: ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安 全。这种划分是使用并发度获得的,它是 ConcurrentHashMap 类构造函数的一 个可选参数,默认值为 16,这样在多线程情况下就能避免争用。 在 JDK8 后,它摒弃了 Segment(锁段)的概 阅读全文
posted @ 2020-06-07 21:23 咔啡 阅读(1295) 评论(0) 推荐(0)
摘要: 在 MyISAM Static 上的所有字段有固定宽度。动态 MyISAM 表将具有像 TEXT, BLOB 等字段,以适应不同长度的数据类型。 MyISAM Static 在受损情况下更容易恢复。 阅读全文
posted @ 2020-06-07 21:21 咔啡 阅读(521) 评论(0) 推荐(0)
摘要: 一个很明显的原因是 JAVA 提供的锁是对象级的而不是线程级的,每个对象都有 锁,通过线程获得。由于 wait,notify 和 notifyAll 都是锁级别的操作,所以把他 们定义在 Object 类中因为锁属于对象。 阅读全文
posted @ 2020-06-07 21:09 咔啡 阅读(788) 评论(0) 推荐(0)
摘要: 它用来压缩 MyISAM 表,这减少了磁盘或内存使用。 阅读全文
posted @ 2020-06-07 20:49 咔啡 阅读(185) 评论(0) 推荐(0)
摘要: 1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同 2、CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255 当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。 阅读全文
posted @ 2020-06-07 20:34 咔啡 阅读(201) 评论(0) 推荐(0)
摘要: interrupt interrupt 方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监 视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出 interruptedException 的方法)就是 阅读全文
posted @ 2020-06-07 19:33 咔啡 阅读(609) 评论(0) 推荐(0)
摘要: SynchronizedMap 一次锁住整张表来保证线程安全,所以每次只能有一个线程来 访为 map。 ConcurrentHashMap 使用分段锁来保证在多线程下的性能。 ConcurrentHashMap 中则是一次锁住一个桶。ConcurrentHashMap 默认将 hash 表分为 16 阅读全文
posted @ 2020-06-07 16:47 咔啡 阅读(379) 评论(0) 推荐(0)
摘要: 使用共享变量的方式 在这种方式中,之所以引入共享变量,是因为该变量可以被多个执行相同任务的 线程用来作为是否中断的信号,通知中断线程的执行。 使用 interrupt 方法终止线程 如果一个线程由于等待某些事件的发生而被阻塞,又该怎样停止该线程呢?这种 情况经常会发生,比如当一个线程由于需要等候键盘 阅读全文
posted @ 2020-06-07 16:46 咔啡 阅读(519) 评论(0) 推荐(0)
摘要: Java 中的 Semaphore 是一种新的同步类,它是一个计数信号。从概念上讲,从 概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release()添加一个许可,从而可能释放一个 正在阻塞的获取者。但是,不使用实际的许可对象, 阅读全文
posted @ 2020-06-07 16:45 咔啡 阅读(556) 评论(0) 推荐(0)
摘要: 在上下文切换过程中,CPU 会停止处理当前运行的程序,并保存当前程序运行的 具体位置以便之后继续运行。 从这个角度来看,上下文切换有点像我们同时阅读几本书,在来回切换书本的同时我们需要记住每本书当前读到的页码。在程序中, 上下文切换过程中的“页码”信息是保存在进程控制块(PCB)中的。 PCB 还经 阅读全文
posted @ 2020-06-07 16:44 咔啡 阅读(1160) 评论(0) 推荐(0)
摘要: 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口,需要实现的是 call() 方法 阅读全文
posted @ 2020-06-07 16:43 咔啡 阅读(290) 评论(0) 推荐(0)
摘要: 线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够 正确地处理多个线程之间的共享变量,使程序功能正确完成。 Servlet 不是线程安全的,servlet 是单实例多线程的,当多个线程同时访问同一个 方法,是不能保证共享变量的线程安全性的。 Struts2 的 action 是多 阅读全文
posted @ 2020-06-07 16:42 咔啡 阅读(265) 评论(0) 推荐(0)
摘要: 线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间。 一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。 同上一个问题,线程调度并不受到 Java 虚拟机控制,所以由应用程序来控制它是 更好的选择(也就是说不要让你的程序依赖于线程的优先级)。 时间分 阅读全文
posted @ 2020-06-07 16:41 咔啡 阅读(327) 评论(0) 推荐(0)
摘要: 如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler 是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异 常将造成线程中断的时候 JVM 会使用 Thread.getUncaughtExceptionHandler() 来查询线程的 阅读全文
posted @ 2020-06-07 16:40 咔啡 阅读(366) 评论(0) 推荐(0)
摘要: 很多 synchronized 里面的代码只是一些很简单的代码,执行时间非常快,此时等 待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核 态切换的问题。既然 synchronized 里面的代码执行得非常快,不妨让等待锁的线 程不要被阻塞,而是在 synchronized 的边 阅读全文
posted @ 2020-06-07 16:37 咔啡 阅读(530) 评论(0) 推荐(0)
摘要: Java 的每个对象中都有一个锁(monitor,也可以成为监视器) 并且 wait(),notify() 等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在 Java 的线程中 并没有可供任何对象使用的锁和同步器。这就是为什么这些方法是 Object 类的一 部分,这样 Java 的每一个 阅读全文
posted @ 2020-06-07 16:36 咔啡 阅读(417) 评论(0) 推荐(0)
摘要: 读写锁是用来提升并发程序性能的锁分离技术的成果。 阅读全文
posted @ 2020-06-07 16:35 咔啡 阅读(211) 评论(0) 推荐(0)
摘要: 最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。Wait 通常被用于线 程间交互,sleep 通常被用于暂停执行。 直接了解的深入一点吧: 在 Java 中线程的状态一共被分成 6 种: 初始态:NEW 创建一个 Thread 对象,但还未调用 start()启动线程时,线程处 阅读全文
posted @ 2020-06-07 16:32 咔啡 阅读(345) 评论(0) 推荐(0)
摘要: 在两个线程间共享变量即可实现共享。 一般来说,共享变量要求变量本身是线程安全的,然后在线程内使用的时候,如果有对共享变量的复合操作,那么也得保证复合操作的线程安全性。 阅读全文
posted @ 2020-06-07 16:31 咔啡 阅读(255) 评论(0) 推荐(0)
摘要: Java API 强制要求这样做,如果你不这么做,你的代码会抛出 IllegalMonitorStateException 异常。还有一个原因是为了避免 wait 和 notify 之间产生竞态条件。 阅读全文
posted @ 2020-06-07 16:30 咔啡 阅读(804) 评论(0) 推荐(0)
摘要: java.util.Timer 是一个工具类,可以用于安排一个线程在未来的某个特定时间执 行。Timer 类可以用安排一次性任务或者周期任务。 java.util.TimerTask 是一个实现了 Runnable 接口的抽象类,我们需要去继承这 个类来创建我们自己的定时任务并使用 Timer 去安 阅读全文
posted @ 2020-06-07 16:29 咔啡 阅读(474) 评论(0) 推荐(0)
摘要: 1、是多个线程涉及到多个锁,这些锁存在着交叉,所以可能会导致了一个锁依赖的闭环。 例如:线程在获得了锁 A 并且没有释放的情况下去申请锁 B,这时,另一个线程 已经获得了锁 B,在释放锁 B 之前又要先获得锁 A,因此闭环发生,陷入死锁循环。 2、默认的锁申请操作是阻塞的。 所以要避免死锁,就要在一 阅读全文
posted @ 2020-06-07 16:26 咔啡 阅读(178) 评论(0) 推荐(0)
摘要: 在 java.lang.Thread 中有一个方法叫 holdsLock(),它返回 true 如果当且仅当当 前线程拥有某个具体对象的锁。 阅读全文
posted @ 2020-06-07 16:23 咔啡 阅读(935) 评论(0) 推荐(0)
摘要: 同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发 集合的可扩展性更高。在 Java1.5 之前程序员们只有同步集合来用且在多线程并发 的时候会导致争用,阻碍了系统的扩展性。Java5 介绍了并发集合像 ConcurrentHashMap,不仅提供线程安全还用锁分离和内部分区等现 阅读全文
posted @ 2020-06-07 16:20 咔啡 阅读(474) 评论(0) 推荐(0)
摘要: 不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code) 应当相同。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)如果两个 第 223 页 共 485 页对象相同(equals 方法返回 true),那么它们的 阅读全文
posted @ 2020-06-07 16:19 咔啡 阅读(677) 评论(0) 推荐(0)
摘要: 每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权, 但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我 们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线 程前执行。线程优先级是一个 int 变量(从 1-10),1 代表最 阅读全文
posted @ 2020-06-07 16:16 咔啡 阅读(533) 评论(0) 推荐(0)
摘要: notify() 方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有 用武之地。而 notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程 能继续运行。 阅读全文
posted @ 2020-06-07 16:14 咔啡 阅读(191) 评论(0) 推荐(0)
摘要: 当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。 Object 类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态。 阅读全文
posted @ 2020-06-07 16:11 咔啡 阅读(1598) 评论(0) 推荐(0)
摘要: Synchronized 关键字,Lock 锁实现,分布式锁等。 阅读全文
posted @ 2020-06-07 16:10 咔啡 阅读(448) 评论(0) 推荐(0)
摘要: 1、CountDownLatch 简单的说就是一个线程等待,直到他所等待的其他线程都执 行完成并且调用 countDown()方法发出通知后,当前线程才可以继续执行。 2、cyclicBarrier 是所有线程都进行等待,直到所有线程都准备好进入 await()方 法之后,所有线程同时开始执行! 3 阅读全文
posted @ 2020-06-07 16:08 咔啡 阅读(325) 评论(0) 推荐(0)
摘要: Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本 数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本 数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer, 从 Java 5 开始引入了自动装箱/拆箱 阅读全文
posted @ 2020-06-07 16:07 咔啡 阅读(221) 评论(0) 推荐(0)
摘要: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。 当前线程到了就绪状态,那么接下来哪个线程会从就绪状态变成执行状态呢?可 能是当前线程,也可能是其他线程,看系统的分配了。 阅读全文
posted @ 2020-06-07 16:06 咔啡 阅读(850) 评论(0) 推荐(0)
摘要: 2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。 补充:我们为编写的类重写 hashCode 方法时,可能会看到如下所示的代码,其实我们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码),而且为什么这个数是个素数,为什么通常选择 31 这个数 阅读全文
posted @ 2020-06-07 16:03 咔啡 阅读(252) 评论(0) 推荐(0)
摘要: 对于可见性,Java 提供了 volatile 关键字来保证可见性。 当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存,当 有其他线程需要读取时,它会去内存中读取新值。 从实践角度而言,volatile 的一个重要作用就是和 CAS 结合,保证了原子性,详 细的可以参见 阅读全文
posted @ 2020-06-07 16:02 咔啡 阅读(283) 评论(0) 推荐(0)
摘要: 数组没有 length()方法,有 length 的属性。 String 有 length()方法。JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。 阅读全文
posted @ 2020-06-07 16:01 咔啡 阅读(433) 评论(0) 推荐(0)
摘要: 在 Java 中可以有很多方法来保证线程安全——同步,使用原子类(atomic concurrent classes),实现并发锁,使用 volatile 关键字,使用不变类和线程安 全类。 阅读全文
posted @ 2020-06-07 15:59 咔啡 阅读(1112) 评论(1) 推荐(0)
摘要: JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的 类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件 中的类。 由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一 个或多个类文件。当 Java 程 阅读全文
posted @ 2020-06-07 15:58 咔啡 阅读(217) 评论(0) 推荐(0)
摘要: 阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket 的 accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前 线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在 任务完成前就返回。 阅读全文
posted @ 2020-06-07 15:57 咔啡 阅读(957) 评论(0) 推荐(0)
摘要: 首先明确的是,char的长bai度是不可变du的,而varchar的长度是可变的,定义一个char[10]和varchar[10],如果zhi存进去的是‘abcd’,那么daochar所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,c 阅读全文
posted @ 2020-06-07 15:56 咔啡 阅读(932) 评论(0) 推荐(0)