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(); }}

  • 怎么实现线程同步
  • java中线程的状态
  • Java 线程的join方法
  • 什么是线程?
  • java如何停止线程
  • 热门搜索
    好书伴我行手抄报 我是文明小学生手抄报 高中手抄报 端午节手抄报文字内容 法律进校园手抄报 有关诚信的手抄报 关于校园的手抄报 英语国庆节手抄报内容 小学生科技手抄报图片 猴年春节手抄报