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



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

//饿汉式
/*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. SQLServer (2005/2008) 日志清理方法

    --数据库日志名称查询 USE DBNAME GO SELECT file_id, name,* FROM sys.database_files; GO------------------------ ...

  2. SPOJ QTREE Query on a tree V

    You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...

  3. xCode控制台的使用-应用闪退原因跟踪

    xCode控制台的使用-应用闪退原因跟踪 今天遇到这个一个问题,使用xCode version = 5.0 编译一个程序,刷到IOS7设备后,应用运行正常,但是刷新到IOS<7,打开饮用后就会出 ...

  4. C# WebHTTPUtil工具类

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Android使用圆角

    圆角Button 效果图 绿色Button 定义button_green.xml资源文件位于drawable文件夹下,可用作button的background属性 button_green.xml: ...

  6. 刷leetcode是什么样的体验?【转】

    转自:https://www.zhihu.com/question/32322023 刷leetcode是什么样的体验? https://leetcode.com/ 1 条评论   默认排序 按时间排 ...

  7. LeetCode OJ-- Length of Last Word

    https://oj.leetcode.com/problems/length-of-last-word/ 对一个字符串遍历,求最后一个单词的长度,如果有 ‘ ’,则切开了. 字符串的最后一个字符为 ...

  8. Codeforces Gym100971 L.Chess Match (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)

    这个题就是两个队,看最多能赢的个数,然后比较一下,看两个队是都能赢彼此,还是只有一个队赢的可能性最大.表达能力不好,意思差不多... 和田忌赛马有点像,emnnn,嗯. 代码: 1 #include& ...

  9. git常用命令,制作缩写命令

    目录 基础命令 常用命令列表 查看状态 添加到本地仓库 推送到远程仓库 创建分支 更新分支, 合并分支 查看分支的差异 回滚 其它 缩写命令 基础命令 # 生成SSH key ssh-keygen - ...

  10. 开始docker

    安装   docker 目前只支持64位系统 1.下载并安装,简直太方便了 $ curl -fsSL https://get.docker.com/ | sh 用例   .docker run hel ...