一、多线程下的单例设计模式



利用双重推断的形式解决懒汉式的安全问题和效率问题

//饿汉式
/*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肯定会切换还有一线程,所以死锁的情况发生的概率极低。可是一旦发生,程序就会彻底卡壳



关于线程同步问题和锁的总结:

1、synchronized是为了保护多线程同一时候訪问同一个资源时对资源内部成员的破坏。

2、线程同步方法(非同布)是通过锁来实现,每个对象实例都有且仅有一个锁this,这个锁与一个特定的对象关联。某线程一旦获取了这个锁,那么其它訪问该对象的线程就无法再訪问该对象的其它同步方法。线程能够拥有多个锁
3、对于静态同步方法。锁是针对这个类的,锁对象是该类的字节码对象(class)。

静态和非静态方法的锁互不干预。

一个线程获得锁,当在一个同步方法中訪问另外对象上的同步方法时,会获取这两个对象锁。

4、对于同步。要时刻清醒在哪个对象上同步。这是关键。
5、编写线程安全的类,须要时刻注意对多个线程竞争訪问资源的逻辑和安全做出正确的推断,对“原子”操作做出分析,并保证原子操作期间别的线程无法訪问竞争资源。
6、当多个线程等待一个对象锁时。没有获取到锁的线程将发生堵塞(死锁)。

JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题的更多相关文章

  1. JAVA学习第二十六课(多线程(五))- 多线程间的通信问题

    一.线程间的通信 实例代码: 需求是:输入一个姓名和性别后,就输出一个姓名和性别 class Resource { String name; String sex ; } class Input im ...

  2. JAVA学习第二十九课(经常使用对象API)- String类

    多线程告一段落,開始经常使用对象API的涉及,背也要背下来!.! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不能够被改变 一.特点 publ ...

  3. Java学习第二十五天

    1:如何让Netbeans的东西Eclipse能访问. 在Eclipse中创建项目,把Netbeans项目的src下的东西给拿过来即可. 注意:修改项目编码为UTF-8 2:GUI(了解) (1)用户 ...

  4. Python学习第二十五课——Mysql (多表查询)

    多表查询: 内连接查询: 首先:创建两个表一个为tableA,一个为tableB,并且插入数据(代码省略) 同时查询两个表的记录: select * from tableA,tableB; 根据tab ...

  5. 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录

    风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...

  6. NeHe OpenGL教程 第二十五课:变形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  8. 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周

    java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...

  9. 风炫安全web安全学习第二十八节课 CSRF攻击原理

    风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...

随机推荐

  1. svn提示出错异常为remains in conflict

    查看原文:http://www.ibloger.net/article/225.html 提交冲突代码 commit -m "" E:/Program Files/MyEclips ...

  2. bzoj 2749 - 外星人

    Description 给定一个数的标准分解\(N= \prod_{i=1}^n p_i^{q_i}\) 其中\(p_i \le 10^5, q_i \le 10^9\) 求最小的\(x\)使得\(\ ...

  3. Swing要点

    1. 布局管理器会控制潜逃在其他组件中组件的大小和位置. 2. 当某个组件加到背景组件上面时,被加入的组件是由背景组件的布局管理器管理的. 3. 布局管理器在做决定之前会询问组件的理想大小(setSi ...

  4. JDBC连接池&DBUtils使用

    使用连接池改造JDBC的工具类: 1.1.1          需求: 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序. * 在程序开始的 ...

  5. 【shell入门】Shell用法

    参考:http://www.cnblogs.com/Lynn-Zhang/p/5758287.html 1.sh/bash/csh/Tcsh/ksh/pdksh等shell的区别 sh(全称 Bour ...

  6. 倒计时器CountDownLatch与同步屏障CyclicBarrier

    CountDownLatch CountDownLatch是一个非常实用的多线程控制工具类,这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行.在这里指CountDownL ...

  7. dhcp 学习整理

    centos 6.5 rpm: dhcp-4.1.1-25.P1.el6.x86_64 dhcp-common-4.1.1-25.P1.el6.x86_64 服务: /etc/rc.d/init.d/ ...

  8. Codeforces Gym101473 F.Triangles-前缀和 (2013-2014 ACM-ICPC Brazil Subregional Programming Contest)

    前缀和. 代码: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include< ...

  9. ELK之filebeat替代logstash收集日志

    filebeat->redis->logstash->elasticsearch 官网下载地址:https://www.elastic.co/downloads/beats/file ...

  10. 标签页的切换方法(DOM)

    效果: 1.点击“JAVA语言” 2.点击“C语言” 3.点击C++语言 代码: <!doctype html> <html> <head> <meta ch ...