java线程同步的方式主要有
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、使用特殊域变量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();
}
}
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();
}
}
以上4种是针对单机应用的,如果是分布式的话,这些就不起效果了,需要用到分布式锁,后面会讲述到