黑马程序员——多线程(二)
来源:互联网 发布:拳击手套 知乎 编辑:程序博客网 时间:2024/05/28 03:03
---------------------- android培训、java培训、期待与您交流! ----------------------
多线程(二)
单例设计模式的两种方式:
//饿汉式:
class Single {private Single() {}private static Single single = new Single();public static Single getInstance() {return single;}
//懒汉式
/*
特点:延迟加载。多线程访问时存在安全问题,可以添加同步代或同步代码块,但是比较低效;利用双重判断可以解决效率问题。
*/
class Single {private Single() {}pivate static Single single = null;public static Single getInstance() {if(single == null){synchronized(Single.class) {//此处的锁是该类的字节码文件对象if(single == null) {single = new Single(); }}return single;}}}
死锁:
多线程可能产生死锁如:在同步代码块中调用同步函数,又在同步函数中使用同步代码块
class DeadLock implements Runnable {private boolean flag;DeadLock(boolean falg) {this.flag = flag;}public void run() {if (flag==true){synchronized(MyLock.obj1) {System.out.println(Thread.currentThread().getName()+"if obj1");synchronized(MyLock.obj2) {System.out.println(Thread.currentThread().getName()+"if boj2");}}}else {synchronized(MyLock.obj2) {System.out.println(Thread.currentThread().getName()+"else obj2");synchronized(MyLock.obj1) {System.out.println(Thread.currentThread().getName()+"else obj1");}}}}}public class DeadLockDemo{public static void main(String[] args) {DeadLock dl1 = new DeadLock(true);DeadLock dl2 = new DeadLock(false);Thread t1 = new Thread(dl1);Thread t2 = new Thread(dl2);t1.start();t2.start();}}class MyLock{static Object obj1 = new Object();static Object obj2 = new Object();}
线程之间的通信:
多个线程操作同一个资源,但是操作动作不同。
class InputOutputDemo{public static void main(String[] args) {Resource res = new Resource();Input in = new Input(res);Output ou = new Output(res);Thread t1 = new Thread(in);Thread t2 = new Thread(ou);t1.start();t2.start();}}class Resource { String name; int age;}class Input implements Runnable {private Resource res;public Input(Resource res) {this.res = res;}public void run() {boolean flag = true;while(true) {if(flag){res.name = "maike";res.age = 10;}else{res.name = "史密斯";res.age = 20;}flag = !flag;}}}class Output implements Runnable {private Resource res;public Output(Resource res) {this.res = res;}public void run() {while(true)System.out.println(res.name +"///"+ res.age);}}
以上代码的运行会有安全问题,name 和age 的存取不进行同步就会出现不一致的情况。解决方法是对Input类中run方法中的name 和age 同步以及Output类中run方法的打印语句同步即可。
---------------------- android培训、java培训、期待与您交流! ----------------------
- 黑马程序员——多线程(二)
- 黑马程序员——多线程(二)
- 黑马程序员——多线程(二)
- 黑马程序员——多线程(二)
- 黑马程序员——多线程(二)
- 黑马程序员——多线程(二)
- 黑马程序员——多线程(二)
- 黑马程序员——多线程(二)
- 黑马程序员——多线程二
- 黑马程序员——day12多线程(二)
- 黑马程序员——多线程学习笔记(二)
- 黑马程序员——JAVA基础----多线程(二)
- 黑马程序员—javaSE—多线程 (二)
- 黑马程序员 多线程(二)
- 黑马程序员 多线程(二)。
- 黑马程序员-------多线程(二)
- 黑马程序员---多线程(二)
- 黑马程序员--多线程(二)
- 【Android 开发教程】ListView的基本使用
- 微速(微锐) 与 打码工作
- C++学习笔记
- 老机换新颜 上 archlinux xfce4 截图
- 如何在遍历list,vector,map时删除符合条件的元素
- 黑马程序员——多线程(二)
- 笔记
- redhat下如何安装eclipse
- 对SmartRF05EB and CC2530 的Z-Stack 用户向导
- PendingIntent实现原理和代码
- Drawable类,在不同分辨率下的设置
- linux设备模型之 kobject原理与实例分析
- 文件处理_保留版_项目中用到
- 公交换乘算法