Java入门——同步与死锁
同步
解决资源共享的同步操作,可以使用同步代码块和同步方法两种方法完成。
1 package Sep19; 2 3 class MyThread implements Runnable{ 4 private int ticket=5; 5 public void run(){//覆写run方法 6 for(int i=0;i<100;i++){ 7 if (ticket>0){ 8 try{ 9 Thread.sleep(3000); 10 }catch(InterruptedException e){ 11 e.printStackTrace(); 12 } 13 System.out.println("卖票:ticket="+ticket--); 14 } 15 } 16 } 17 } 18 public class SyncDemo01{ 19 public static void main(String[] args) { 20 MyThread mt=new MyThread(); 21 Thread t1=new Thread(mt); 22 Thread t2=new Thread(mt); 23 Thread t3=new Thread(mt); 24 t1.start(); 25 t2.start(); 26 t3.start(); 27 } 28 }
卖票:ticket=5 卖票:ticket=3 卖票:ticket=4 卖票:ticket=2 卖票:ticket=1 卖票:ticket=0
同步代码块
在所需要同步的代码前加关键字:synchronized(同步对象){需要同步的代码;}
同步方法:
可以使用synchronized关键字声明同步方法。
死锁
过多的同步操作也可能产生死锁的现象,两个线程都在彼此等待对方的执行完成,这样,线程就会无法继续向下执行,从而造成了死锁的现象。
线程的经典案例——生产者与消费者
package Sep19; class Info{ private String name="李兴华"; private String content="JAVA讲师"; public void setName(String name) { this.name = name; } public void setContent(String content) { this.content = content; } public String getName() { return name; } public String getContent() { return content; } } class Producer implements Runnable{ private Info info=null; public Producer(Info info){ this.info=info; } public void run() { boolean flag=false; for (int i = 0; i < 50; i++) { if(flag){ this.info.setName("李兴华"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.info.setContent("JAVA讲师"); flag=false; }else{ this.info.setName("mldn"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.info.setContent("www.mldn.java.com"); flag=true; } } } } class Consumer implements Runnable{ private Info info=null; public Consumer(Info info){ this.info=info; } public void run() { for (int i = 0; i < 50; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.info.getName()+"------->"+this.info.getContent()); } } } public class ThreadCaseDemo01 { public static void main(String[] args) { Info i=new Info(); Producer p=new Producer(i); Consumer con=new Consumer(i); new Thread(p).start(); new Thread(con).start(); } }
李兴华------->www.mldn.java.com 李兴华------->www.mldn.java.com mldn------->JAVA讲师 mldn------->JAVA讲师 李兴华------->www.mldn.java.com 李兴华------->JAVA讲师 mldn------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com mldn------->JAVA讲师 李兴华------->www.mldn.java.com 李兴华------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com 李兴华------->www.mldn.java.com 李兴华------->www.mldn.java.com 李兴华------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com 李兴华------->JAVA讲师 mldn------->www.mldn.java.com mldn------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com mldn------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com 李兴华------->JAVA讲师 mldn------->www.mldn.java.com 李兴华------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 李兴华------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com mldn------->JAVA讲师 mldn------->www.mldn.java.com mldn------->JAVA讲师 李兴华------->www.mldn.java.com 李兴华------->JAVA讲师
本代码出现了重复生产和姓名内容不匹配的现象,需要加入同步,也就是说把setName和setContent设置为在同一个代码块中完成,解决其错位问题。利用Obeject类中等待唤醒机制,的解决错位问题。
package Sep19; class Info{ private String name="李兴华"; private String content="JAVA讲师"; private boolean flag=false; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public synchronized void set(String name,String content){ if(!flag){ try { super.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.setName(name); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } this.setContent(content); flag=false; super.notify(); } public synchronized void get(){ try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.getName()+"----->"+this.getContent()); flag=false; super.notify(); } } class Producer implements Runnable{ private Info info=null; public Producer(Info info){ this.info=info; } public void run() { boolean flag=false; for (int i = 0; i < 50; i++) { if(flag){ this.info.set("李兴华","JAVA讲师"); flag=false; }else{ this.info.set("mldn","www.mldn.java.com"); flag=true; } } } } class Consumer implements Runnable{ private Info info=null; public Consumer(Info info){ this.info=info; } public void run() { for (int i = 0; i < 50; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.info.get(); } } } public class ThreadCaseDemo01 { public static void main(String[] args) { Info i=new Info(); Producer p=new Producer(i); Consumer con=new Consumer(i); new Thread(p).start(); new Thread(con).start(); } }
李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师 mldn----->www.mldn.java.com 李兴华----->JAVA讲师