一、synchronized锁
任意对象都可以作为同步锁。所有对象都自动包含单一的锁。
同步方法的锁:静态方法:使用类名.class; 非静态方法:使用this
同步代码块:自行指定,大多数指定为类名.class或this
保证同一个资源的多个线程共用一把锁,--->保证资源安全
会导致锁释放的情况
当前线程的同步方法、同步代码块执行结束
当前线程在同步代码块、同步方法中遇到break、return终止了代码块和该方法的继续执行
当前线程在同步代码块、同步方法中出现了未处理的Error或Exception导致异常结束
当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并且释放锁。
不会导致锁释放的情况:
线程执行同步代码块或同步方法时,程序调用Thread.sleep(),Thread,yield()方法暂停当前线程的执行
线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,不会释放锁。
避免使用suspend()和resume()来控制线程
死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己所需要的同步资源,形成了线程死锁。
注:出现死锁后,不会出现异常,不会提示。但所有的线程都处于阻塞状态,无法继续执行。
如何解决死锁:
尽量避免嵌套同步
使用专门的算法
减少同步资源的定义。
示例:
版权声明:本文为m0_57753335原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。