黑马程序员——多线程(二)

来源:互联网 发布:拳击手套 知乎 编辑:程序博客网 时间: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培训、期待与您交流! ----------------------