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

作者:国际小甜 | 创建时间: 2023-05-01
线程的常用的同步方式:1,synchronized关键词 修饰方法;如:public synchronized void Take(int i){。。。。} 2,synchronized 同步代码块 : synchronized(Objec...
java 线程 (中) :常见的线程同步方式

操作方法

方法一: 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(); } }

方法二: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(); } }

方法三:使用特殊域变量volatile class 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(); } }

方法四:使用重入锁 :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(); } }

温馨提示

线程的同步方式除了以上四种还有许多方式,比如使用局部变量的同步方式等,其他方式我就不再一一介绍了,想知道的可以上网查询相关资料。
上述方法四记住上锁后记得解锁哦,不然就会产生死锁,后果你懂的!
点击展开全文

更多推荐