java多线程-线程同步
2016-05-12 21:16
309 查看
同步与死锁
1、同步代码块在代码块前面加上“synchronized”关键字,则此代码块称为同步代码块
2、同步代码块格式
synchronized(同步对象){
需要同步的代码块;
}
3、同步的方法
代码块可以同步,方法也是可以同步的
4、方法同步格式:
synchronized void 方法名称(){}
实例:三个窗口卖五张车票
不适用同步时的情况 package ThreadTest; //三个窗口卖5张车票 class MyThreadDemo implements Runnable{ //五张车票 private int ticket=5; public void run() { for(int i=0;i<10;i++){ //当车票还有的时候,才会有人在排队买票 if(ticket>0){ try { //买票等待时间,每个人等五百毫秒 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("车票"+ticket--); } } } } public class ThreadDemo05 { public static void main(String[] args) { MyThreadDemo my=new MyThreadDemo(); //三个窗口创建三个线程对象 Thread t1=new Thread(my); Thread t2=new Thread(my); Thread t3=new Thread(my); t1.start(); t2.start(); t3.start(); } } 输出结果 车票5 车票5 车票5 车票4 车票3 车票2 车票1 车票-1 车票0
车票出现了负数,显然与事件不符,此时就是因为资源没法共享,没法同步导致的
那我们加入同步
package ThreadTest; //三个窗口卖5张车票 class MyThreadDemo implements Runnable{ //五张车票 private int ticket=5; public void run() { for(int i=0;i<10;i++){ //加入同步 synchronized (this) { //当车票还有的时候,才会有人在排队买票 if(ticket>0){ try { //买票等待时间,每个人等五百毫秒 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("车票"+ticket--); } } } } } public class ThreadDemo05 { public static void main(String[] args) { MyThreadDemo my=new MyThreadDemo(); //三个窗口创建三个线程对象 Thread t1=new Thread(my); Thread t2=new Thread(my); Thread t3=new Thread(my); t1.start(); t2.start(); t3.start(); } } 输出结果 车票5 车票4 车票3 车票2 车票1
还可以使用同步方法
package ThreadTest; //三个窗口卖5张车票 class MyThreadDemo implements Runnable{ //五张车票 private int ticket=5; public void run() { for(int i=0;i<10;i++){ //调用sell()方法 sell(); } } //加上同步方法 public synchronized void sell(){ //当车票还有的时候,才会有人在排队买票 if(ticket>0){ try { //买票等待时间,每个人等五百毫秒 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("车票"+ticket--); } } } public class ThreadDemo05 { public static void main(String[] args) { MyThreadDemo my=new MyThreadDemo(); //三个窗口创建三个线程对象 Thread t1=new Thread(my); Thread t2=new Thread(my); Thread t3=new Thread(my); t1.start(); t2.start(); t3.start(); } } 输出结果: 车票5 车票4 车票3 车票2 车票1
死锁
举个例子:死锁:毕业生找工作(高新)
企业需要你有经验才会给高新(经验),这两者互相冲突
解决这个问题的方法就是毕业生降低薪水预期,企业培养你经验
相关文章推荐
- Spring 计划
- 猜数游戏
- 【JDK】:java.lang.String、StringBuilder、StringBuffer 源码解析
- java多线程(三)停止Java线程,小心interrupt()方法
- java20函数的复写override
- 小工具-发邮件-java
- Java基础
- SSM 三大框架---事务处理
- java如何使用DOM文档
- java--IO流基本
- java command 编译 打包
- java中用DOM解析XML文档程序实现
- Spring MVC之视图
- Eclipse快捷键
- 总结JAVA中的条件语句以及循环语句
- Spring 计划
- struts2中的参数传递
- Spring Ioc-依赖注入的几种方式
- 如何在eclipse上配置maven
- java19子类实例化过程