---------------------- 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培训、期待与您交流! ----------------------