java线程死锁问题
2016-03-23 18:46
405 查看
Synchronized关键字
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
以上规则对其它对象锁同样适用.
代码示例
package test160118; public class TestSynchronized { public static void main(String[] args) { Sy sy = new Sy(0); Sy sy2 = new Sy(1); sy.start(); sy2.start(); } } class Sy extends Thread { private int flag ; static Object x1 = new Object(); static Object x2 = new Object(); public Sy(int flag) { this.flag = flag; } @Override public void run() { System.out.println(flag); try { if (flag == 0) { synchronized (x1) { System.out.println(flag+"锁住了x1"); Thread.sleep(1000); synchronized (x2) { System.out.println(flag+"锁住了x2"); } System.out.println(flag+"释放了x1和x2"); } } if(flag == 1) { synchronized (x2) { System.out.println(flag+"锁住了x2"); Thread.sleep(1000); synchronized (x1) { System.out.println(flag+"锁住了x1"); } System.out.println(flag+"释放了x1和x2"); } } } catch (InterruptedException e) { e.printStackTrace(); } } }
相关文章推荐
- spring-mvc中返回fastjson的json数据去掉null值
- java并发包CyclicBarrier
- Java核心知识点-一些基本概念
- Myeclipse 6.6解决eclipse不编译java文件,创建任何类 都提示我 一个错误信息 creation of element failed
- SpringMVC之web.xml,了解必要配置项
- SpringMVC之web.xml,了解必要配置项
- 画板项目——java
- [java]wordcount程序
- <Introduction to Java Programming> Note 01
- Java_IO
- 【JAVA开发之IO流1-1】IO流简介及输入流和输出流
- IntelliJ IDEA中怎么全局搜索替换(整个项目)(Eclipse)
- java得到-100到100之间的随机数(包括-100和100)
- struts2拦截器+过滤器
- Spring-Mongo-Data与Mongo3.2集成问题
- springMVC分析-3
- java动态代理
- 如何让页面里面的java代码高亮显示
- Java GC 小结
- JAVA的23种设计模式