JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题
一、多线程下的单例设计模式
利用双重推断的形式解决懒汉式的安全问题和效率问题
//饿汉式
/*class Single
{
private static final Single t = new Single();
private Single(){} //private构造函数,确保其它类对象不能直接new一个该对象实例 public static Single getInstance()
{
return t;
}
}
*/ //懒汉式
class Single
{
private static Single t = null;
private Single(){}
public static Single getInstance() //同步函数就不是必需了,同步整个函数致使效率减少
{
if(t==null)//解决效率问题
{
synchronized(Single.class)//解决安全问题
{
if(t==null)
t = new Single();
} }
return t;
}
}
所以说开发中还是应用饿汉式,可是在面试里考察懒汉式,由于其技术含量高
二、死锁演示样例
死锁是线程间相互等待锁锁造成的
死锁:常见就是,同步的嵌套
面试时。会让写死锁程序,仅仅要写的出来。就说明死锁已经理解
class Deadlock implements Runnable
{
private boolean flag;
public Deadlock(boolean flag) {
// TODO Auto-generated constructor stub
this.flag = flag;
}
public void run()
{
if(flag)
{
while(true)
synchronized (lock.A_LOCK) {
System.out.println("if...alock");
synchronized (lock.B_LOCK) {
System.out.println("if...block");
}
}
}
else {
while(true)
synchronized (lock.B_LOCK) {
System.out.println("else...block");
synchronized (lock.A_LOCK) {
System.out.println("else...alock"); }
}
}
}
} class lock
{
public static final Object A_LOCK = new Object();
public static final Object B_LOCK = new Object(); }
class Main
{
public static void main(String[] args)
{
Deadlock t1 = new Deadlock(true);
Deadlock t2 = new Deadlock(false);
Thread j1 = new Thread(t1);
Thread j2 = new Thread(t2);
j1.start(); j2.start(); }
}
if...alock
else...block
锁上了,j1线程拿a锁,j2线程拿b锁,两者都在等待,可是不释放锁,就形成了死锁,致使程序死掉,在开发中发生死锁的概率很低。
由于在代码内某处,CPU肯定会切换还有一线程,所以死锁的情况发生的概率极低。可是一旦发生,程序就会彻底卡壳
关于线程同步问题和锁的总结:
静态和非静态方法的锁互不干预。
一个线程获得锁,当在一个同步方法中訪问另外对象上的同步方法时,会获取这两个对象锁。
JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题的更多相关文章
- JAVA学习第二十六课(多线程(五))- 多线程间的通信问题
一.线程间的通信 实例代码: 需求是:输入一个姓名和性别后,就输出一个姓名和性别 class Resource { String name; String sex ; } class Input im ...
- JAVA学习第二十九课(经常使用对象API)- String类
多线程告一段落,開始经常使用对象API的涉及,背也要背下来!.! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不能够被改变 一.特点 publ ...
- Java学习第二十五天
1:如何让Netbeans的东西Eclipse能访问. 在Eclipse中创建项目,把Netbeans项目的src下的东西给拿过来即可. 注意:修改项目编码为UTF-8 2:GUI(了解) (1)用户 ...
- Python学习第二十五课——Mysql (多表查询)
多表查询: 内连接查询: 首先:创建两个表一个为tableA,一个为tableB,并且插入数据(代码省略) 同时查询两个表的记录: select * from tableA,tableB; 根据tab ...
- 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录
风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...
- NeHe OpenGL教程 第二十五课:变形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周
java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...
- 风炫安全web安全学习第二十八节课 CSRF攻击原理
风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...
随机推荐
- react 复习4- 生命周期
实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidMount 实例化完成后的更新 getI ...
- [01] radio ,checkbox 表单文字对齐
http://www.cnblogs.com/wangsir015/p/5555818.html 这几天在做表单时总会碰到复选框(checkbox)和单选框(radio)与文字不对齐的问题,要不是ch ...
- Educational Codeforces Round 37 A B C D E F
A. water the garden Code #include <bits/stdc++.h> #define maxn 210 using namespace std; typede ...
- EOJ Monthly 2017.12 A B C D
// 因为是中文题面就偷一次懒不写题意啦QAQ // 各种大作业然后又要期末还不知道什么时候能补题QAQ A. 唐纳德先生和假骰子 直接模拟 #include <bits/stdc++.h> ...
- 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)
原文转自 http://lishiqiang1988.blog.163.com/blog/static/41147912201382104631547/ VS2010的MFC对话框程序中添加菜单栏的过 ...
- HDU5036 Explosion(期望&&bitset)
#include <iostream> #include <cstring> #include <string> #include <vector> # ...
- (4)JavaScript引用类型
Object类 创建object实例的方式有两种 1.第一种是使用 new 操作符后跟 Object 构造函数 var person = new Object(); person.name = &qu ...
- Codeforces 916E Jamie and Tree (换根讨论)
题目链接 Jamie and Tree 题意 给定一棵树,现在有下列操作: $1$.把当前的根换成$v$:$2$.找到最小的同时包含$u$和$v$的子树,然后把这棵子树里面的所有点的值加$x$: ...
- validate插件使用
validate插件使用 官网:http://jqueryvalidation.org/ 项目实操 引入文件 add.html调用(注意顺序问题) 为form表单定义一个ID,以方便获取该元素 添加验 ...
- Leetcode | Construct Binary Tree from Inorder and (Preorder or Postorder) Traversal
Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a ...