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

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

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

//饿汉式
/*class Single
{
	private static final Single t = new Single();
	private Single(){}
	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

锁上了,Thread-0拿a锁,Thread-1拿b锁

时间: 2024-10-05 19:40:38

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

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

一.线程间的通信 实例代码: 需求是:输入一个姓名和性别后,就输出一个姓名和性别 class Resource { String name; String sex ; } class Input implements Runnable { Resource r; Input(Resource r) { this.r = r; } public void run() { int x = 0; while(true) { synchronized (r) { if(x==0) { r.name =

JAVA学习第二十二课(多线程(二))- (多线程的创建方式一 :继承Thread类)

线程是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 创建新执行线程有两种方法. 一种方法是将类声明为 Thread 的子类.该子类应重写Thread 类的run 方法.另一种方法是声明实现 Runnable 接口的类.该类然后实现run 方法. 创建线程方式一:继承Thread类 一.创建线程的步骤: 1.定义一个类继承Thread类 2.覆盖Thread中的run()方法 3.直接创建Thread类子类的对象 4.调用start方法开启线程,并调用线程的任务run方法

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int

JAVA学习第二十六课(多线程(六))- 多生产者多消费者问题

多生产者多消费者问题 以生产馒头 消费馒头为例. class Resource { private String name; private int count = 1; private boolean flag = false; public synchronized void set(String name) { if (flag) { try { this.wait(); } catch (Exception e) { // TODO: handle exception } } this.

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

多线程告一段落,開始经常使用对象API的涉及,背也要背下来!.! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不能够被改变 一.特点 public class Main { public static void main(String[] args) { Demo1(); System.out.println("--------------"); Demo2(); } /*演示字符串的第一种定义方式,并明白字符串常量池的特点*/

JAVA学习第二十八课(常用对象API)- String类

多线程告一段落,开始常用对象API的涉及,背也要背下来!!! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不可以被改变 一.特点 public class Main { public static void main(String[] args) { Demo1(); System.out.println("--------------"); Demo2(); } /*演示字符串的第一种定义方式,并明确字符串常量池的特点*/ p

JAVA学习第十五课(多态及其基本应用)

多态: 面向对象的第三个特征,定义:某类事物存在多种形态,比如,函数就具备多态性,同名的一个函数,它的参数列表不一样,它的存在性就不一样,还有同一个函数,放在父类和放在子类,它的存在性也就不一样. 对象也存在多态性. 例子:动物有猪.猫.狗等 猫这个对象对应的类是猫类 猫 x = new 猫(): 同时,猫还是动物的一种,也就可以把猫成为动物 动物 y = new 猫(); 动物 z = new 狗(); 动物是狗和猫集体事物中抽取出来的父类 父类引用指向了子类对象 一.概述 //对象的多态性

Java学习第二十五天

1:如何让Netbeans的东西Eclipse能访问. 在Eclipse中创建项目,把Netbeans项目的src下的东西给拿过来即可. 注意:修改项目编码为UTF-8 2:GUI(了解) (1)用户图形界面 GUI:方便直观 CLI:需要记忆一下命令,麻烦 (2)两个包: java.awt:和系统关联较强 javax.swing:纯Java编写 (3)GUI的继承体系 组件:组件就是对象 容器组件:是可以存储基本组件和容器组件的组件. 基本组件:是可以使用的组件,但是必须依赖容器. (4)事件

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

多表查询: 内连接查询: 首先:创建两个表一个为tableA,一个为tableB,并且插入数据(代码省略) 同时查询两个表的记录: select * from tableA,tableB; 根据tableA中id 等于 tableB 中refer_id 进行内连接查询: select * from tableA,tableB where tableA.id=tableB.refer_id; 也可以用一下方法进行内连接查询: select * from tableB inner join tabl