摘要: 双因素身份验证为帐户登录过程启用第二级身份验证。 因此,假设用户必须只输入用户名和密码,那么这被认为是单因素身份验证。 阅读全文
posted @ 2020-06-08 22:35 咔啡 阅读(2182) 评论(0) 推荐(0)
摘要: 为什么要使用 Executor 线程池框架 1、每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗 时、耗资源的。 2、调用 new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的 创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线 阅读全文
posted @ 2020-06-08 22:29 咔啡 阅读(520) 评论(0) 推荐(0)
摘要: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每 次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传 统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写 锁等,都是在做操作之前先上锁。再比如 Java 里面的同步原语 synchroniz 阅读全文
posted @ 2020-06-08 22:27 咔啡 阅读(340) 评论(0) 推荐(0)
摘要: 如果其他方法没有 synchronized 的话,其他线程是可以进入的。 所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的。 阅读全文
posted @ 2020-06-08 22:26 咔啡 阅读(183) 评论(0) 推荐(0)
摘要: 举例来说明锁的可重入性 public class UnReentrant{ Lock lock = new Lock(); public void outer(){ lock.lock(); inner(); lock.unlock(); } public void inner(){ lock.lo 阅读全文
posted @ 2020-06-08 22:22 咔啡 阅读(425) 评论(0) 推荐(0)
摘要: volatile 保证内存可见性和禁止指令重排。 volatile 用于多线程环境下的单次操作(单次读或者单次写)。 阅读全文
posted @ 2020-06-08 22:11 咔啡 阅读(210) 评论(0) 推荐(0)
摘要: 我们可以使用 Thread 类的 join()方法来确保所有程序创建的线程在 main()方法退出前结束。 阅读全文
posted @ 2020-06-08 21:58 咔啡 阅读(798) 评论(0) 推荐(0)
摘要: 创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变 长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候 就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从 JDK1.5 开始,Java API 提供了 Executor 框架让你可以创建不同的 阅读全文
posted @ 2020-06-08 18:14 咔啡 阅读(595) 评论(0) 推荐(0)
摘要: 处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。 阅读全文
posted @ 2020-06-08 15:51 咔啡 阅读(558) 评论(0) 推荐(0)
摘要: 两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中。 而 submit()方法可以返回持有计算结果的 Future 对象,它定义在 ExecutorService 接口中,它扩展了 Executor 接口,其它线程池类像 ThreadPo 阅读全文
posted @ 2020-06-08 15:25 咔啡 阅读(513) 评论(0) 推荐(0)
摘要: 1、新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 2、就绪状态(Runnable):当调用线程对象的 start()方法(t.start();),线程 即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时 等待 阅读全文
posted @ 2020-06-08 15:19 咔啡 阅读(396) 评论(0) 推荐(0)
摘要: 当然可以。但是如果我们调用了 Thread 的 run()方法,它的行为就会和普通的方 法一样,会在当前线程中执行。为了在新的线程中执行我们的代码,必须使用 Thread.start()方法。 阅读全文
posted @ 2020-06-08 00:43 咔啡 阅读(625) 评论(0) 推荐(0)
摘要: 1、采用实现 Runnable、Callable 接口的方式创建多线程。 优势是: 线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。 在这种方式下,多个线程可以共享同一个 target 对象,所以非常适合多个相同线 程来处理同一份资源的情况,从而可以将 CPU、 阅读全文
posted @ 2020-06-08 00:36 咔啡 阅读(180) 评论(0) 推荐(0)
摘要: 这个其实前面有提到过,FutureTask 表示一个异步运算的任务。FutureTask 里面 可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等 待获取、判断是否已经完成、取消任务等操作。当然,由于 FutureTask 也是 Runnable 接口的实现类,所以 阅读全文
posted @ 2020-06-08 00:34 咔啡 阅读(774) 评论(0) 推荐(0)
摘要: CAS 是 compare and swap 的缩写,即我们所说的比较交换。 cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通 阅读全文
posted @ 2020-06-08 00:33 咔啡 阅读(3214) 评论(0) 推荐(0)
摘要: 我们可以使用 Thread 类的 Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为 Runnable,并且根据线程调度,它将得到执行。 阅读全文
posted @ 2020-06-08 00:28 咔啡 阅读(258) 评论(0) 推荐(0)
摘要: 不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer 及其它包装类。 详情参见答案,一步一步指导你在 Java中创建一个不可变的类。 阅读全文
posted @ 2020-06-08 00:27 咔啡 阅读(431) 评论(0) 推荐(0)
摘要: 1、继承 Thread 类创建线程类 2、通过 Runnable 接口创建线程类 3、通过 Callable 和 Future 创建线程 4、通过线程池创建 阅读全文
posted @ 2020-06-08 00:25 咔啡 阅读(84) 评论(0) 推荐(0)
摘要: Semaphore 就是一个信号量,它的作用是限制某段代码块的并发数。Semaphore 有一个构造函数,可以传入一个 int 型整数 n,表示某段代码最多只有 n 个线程可 以访问,如果超出了 n,那么请等待,等到某个线程执行完毕这段代码块,下一个 线程再进入。由此可以看出如果 Semaphore 阅读全文
posted @ 2020-06-08 00:05 咔啡 阅读(465) 评论(0) 推荐(0)
摘要: CopyOnWriteArrayList(免锁容器)的好处之一是当多个迭代器同时遍历和修改这 个列表时,不会抛出 ConcurrentModificationException。在 CopyOnWriteArrayList 中,写入将导致创建整个底层数组的副本,而源数组将保 留在原地,使得复制的数组 阅读全文
posted @ 2020-06-08 00:02 咔啡 阅读(1144) 评论(0) 推荐(0)