您的位置首页百科知识

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

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

的有关信息介绍如下:

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

线程的常用的同步方式:1,synchronized关键词 修饰方法;如:public synchronized void Take(int i){。。。。}

2,synchronized 同步代码块 :synchronized(Object){}如:

synchronized(this){

System.out.print(this.getName()+" :");

b.Take(5);

}

3,使用特殊域变量volatile

4,使用重入锁 :java.util.concurrent.ReentrantLock类

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

}

}