手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

java 线程 (中) :常见的线程同步方式

时间:2024-11-21 01:30:03

1、方法一:synchronized关键词 修饰方法class bank { public int take=100;//计数器 public int getcount(){ return take; } public synchronized void Take(int i){ //同步关键词修饰方法 take=take-i; System.out.println(" 拿了5块,还剩"+take); }//测试public class testThread extends Thread{ private bank b; public testThread(String s,bank b){ super(s); this.b=b; } public void run(){ for(int i=0;i<5;i++){ try{ Thread.sleep(1000); //睡眠延迟时间 1000:大概延迟一秒 }catch(InterruptedException e){ e.printStackTrace(); } System.out.print(this.getName()+" :"); b.Take(5);} } } public static void main(String[] args) { //启动线程 bank b1=new bank(); new testThread("tom",b1).start(); new testThread("joh",b1).start(); }}

2、方法二:synchronized 同步代码块class bank { public int take=100;//计数器 public int getcount(){ return take; } public void Take(int i){ take=take-i; System.out.println(" 拿了5块,还剩"+take); }}//测试public class testThread extends Thread{ private bank b; public testThread(String s,bank b){ super(s); this.b=b; } public void run(){ for(int i=0;i<5;i++){ try{ Thread.sleep(1000); //睡眠延迟时间 1000:大概延迟一秒 }catch(InterruptedException e){ e.printStackTrace(); } synchronized(this){ //同步代码块 System.out.print(this.getName()+" :"); b.Take(5); } } } public static void main(String[] args) { //启动线程 bank b1=new bank(); new testThread("tom",b1).start(); new testThread("joh",b1).start(); }}

3、方法三:使用特殊域变量volatileclass bank { public volatile int take=100;//用volatile 修饰同步变量 public int getcount(){ return take; } public void Take(int i){ take=take-i; System.out.println(" 拿了5块,还剩"+take); }}//测试public class testThread extends Thread{ private bank b; public testThread(String s,bank b){ super(s); this.b=b; } public void run(){ for(int i=0;i<5;i++){ try{ Thread.sleep(1000); //睡眠延迟时间 1000:大概延迟一秒 }catch(InterruptedException e){ e.printStackTrace(); } System.out.print(this.getName()+" :"); b.Take(5); } } public static void main(String[] args) { //启动线程 bank b1=new bank(); new testThread("tom",b1).start(); new testThread("joh",b1).start(); }}

4、方法四:使用重入锁 :java.util.concurrent.ReentrantLock类class bank { public int take=100; public int getcount(){ return take; } private Lock lock=new ReentrantLock();//创建锁 public void Take(int i){ lock.lock(); //上锁后 在解锁前的操作只能同步操作,不能异步运行 take=take-i; System.out.println(" 拿了5块,还剩"+take); lock.unlock(); //解锁 }}//测试//导入相关包import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class testThread extends Thread{ private bank b; public testThread(String s,bank b){ super(s); this.b=b; } public void run(){ for(int i=0;i<5;i++){ try{ Thread.sleep(1000); //睡眠延迟时间 1000:大概延迟一秒 }catch(InterruptedException e){ e.printStackTrace(); } System.out.print(this.getName()+" :"); b.Take(5);// synchronized(this){// System.out.print(this.getName()+" :");// b.Take(5);// } } } public static void main(String[] args) { //启动线程 bank b1=new bank(); new testThread("tom",b1).start(); new testThread("joh",b1).start(); }}

© 手抄报圈