同步函数使用的锁是this;
同步函数和同步代码块的区别:
同步函数的锁是固定的this。
同步代码块的锁是任意的对象。
建议使用同步代码块.
静态的同步函数使用的锁是该函数所属字节码文件对象,
可以用getClass方法获取也可以用当前类名.class表示。
单例设计模式所涉及的多线程问题(关于单例模式的介绍http://blog.csdn.net/jason0539/article/details/23297037介绍的比较详细)
饿汉式单例模式不存在多线程安全问题
而懒汉式单例模式则会出现多线程问题,一般我们通过同步代码块来解决(使用同步函数的话会每次都需要判断锁,降低效率)
而使用同步代码块的话,可以在判断锁之前先加个if判断。
加锁是为了解决线程安全问题,之前多加一次判断是为了解决效率问题。
多线程的死锁现象:
死锁常见情景之一就是程序的嵌套。
死锁需要尽量避免,但是要会写死锁程序(找工作面试会用到!)
1 public class DeadLockDemo { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 6 DeadLock d1 = new DeadLock(true); 7 DeadLock d2 = new DeadLock(false); 8 9 Thread t1 = new Thread(d1); 10 Thread t2 = new Thread(d2); 11 12 t1.start(); 13 t2.start(); 14 } 15 16 }
1 public class MyLock { 2 3 public static final Object locka = new Object(); 4 public static final Object lockb = new Object(); 5 }
1 public class DeadLock implements Runnable{ 2 private boolean flag; 3 DeadLock(boolean flag){ 4 this.flag = flag; 5 } 6 public void run(){ 7 if(flag){ 8 while(true){ 9 synchronized (MyLock.locka) { 10 System.out.println(Thread.currentThread().getName() + "....if locka...."); 11 synchronized(MyLock.lockb){ 12 System.out.println(Thread.currentThread().getName() + "....if lockb...."); 13 } 14 } 15 } 16 }else{ 17 while(true){ 18 synchronized(MyLock.lockb){ 19 System.out.println(Thread.currentThread().getName() + "....else lockb...."); 20 synchronized(MyLock.locka){ 21 System.out.println(Thread.currentThread().getName() + "....else locka...."); 22 } 23 } 24 } 25 } 26 } 27 28 }
上述程序最好会背!