多线程的使用会导致出现安全问题,怎么解决呢?使用同步synchronized(这单词好难记)
同步的引入就有了锁的引入,下面总结下楼主所知道的关于这个锁的知识点
情况一:
private Object obj = new Object();
synchronized(obj)//同步代码块的锁就是obj,当然这个可以是任意对象
情况二:
public synchronized void sale(){
if(tickets>0){
try{Thread.sleep(10);}
catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"...."+tickets--);//打印线程名称
}
}
同步函数的锁是this,这点还是有些难度去理解的。被调用的时候this.slae();所以这个锁(肯定是个对象)应该是this(调用它的对象)
情况三:
static同步函数,使用的锁不是this,而是字节码文件对象,类名.class
情况四:
单例模式(懒汉模式)中可以使用同步,可以通过双重判断的方式,解决效率额问题,减少判断锁的次数
情况五:
当线程任务中出现了多个同步,如果同步中嵌套了其他同步,容易引起死锁。这种情况要尽量避免。
|
|