Java多线程之Synchronized应用在static和非static方法上的区别
2017-03-03 18:20
393 查看
同步static方法:
public class Bank implements Runnable{
static int money = 2700;
//注意区别
public static synchronized void Withdraw() {
//public synchronized void Withdraw() {
for(int i=0; i<3;i++){
int temp = money;
temp = temp-300;
money = temp;
System.out.println(Thread.currentThread().getName()+" "+money);
}
}
public void run(){
Withdraw();
}
public static void main(String[] args) throws InterruptedException {
Bank b1 = new Bank();
Bank b2 = new Bank();
Bank b3 = new Bank();
Thread t1 = new Thread(b1,"b1");
Thread t2 = new Thread(b2,"b2");
Thread t3 = new Thread(b3,"b3");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("The remaining money is "+money);
}
}结果为:
b1 2400
b1 2100
b1 1800
b2 1500
b2 1200
b2 900
b3 600
b3 300
b3 0
The remaining money is 0
同步非static方法:
public class Bank implements Runnable{
static int money = 2700;
//注意区别
//public static synchronized void Withdraw() {
public synchronized void Withdraw() {
for(int i=0; i<3;i++){
int temp = money;
temp = temp-300;
money = temp;
System.out.println(Thread.currentThread().getName()+" "+money);
}
}
public void run(){
Withdraw();
}
public static void main(String[] args) throws InterruptedException {
Bank b1 = new Bank();
Bank b2 = new Bank();
Bank b3 = new Bank();
Thread t1 = new Thread(b1,"b1");
Thread t2 = new Thread(b2,"b2");
Thread t3 = new Thread(b3,"b3");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("The remaining money is "+money);
}
}
结果为:
b2 2100
b3 2100
b1 2100
b3 1500
b2 1800
b3 900
b1 1200
b2 600
b1 300
The remaining money is 300
public class Bank implements Runnable{
static int money = 2700;
//注意区别
public static synchronized void Withdraw() {
//public synchronized void Withdraw() {
for(int i=0; i<3;i++){
int temp = money;
temp = temp-300;
money = temp;
System.out.println(Thread.currentThread().getName()+" "+money);
}
}
public void run(){
Withdraw();
}
public static void main(String[] args) throws InterruptedException {
Bank b1 = new Bank();
Bank b2 = new Bank();
Bank b3 = new Bank();
Thread t1 = new Thread(b1,"b1");
Thread t2 = new Thread(b2,"b2");
Thread t3 = new Thread(b3,"b3");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("The remaining money is "+money);
}
}结果为:
b1 2400
b1 2100
b1 1800
b2 1500
b2 1200
b2 900
b3 600
b3 300
b3 0
The remaining money is 0
同步非static方法:
public class Bank implements Runnable{
static int money = 2700;
//注意区别
//public static synchronized void Withdraw() {
public synchronized void Withdraw() {
for(int i=0; i<3;i++){
int temp = money;
temp = temp-300;
money = temp;
System.out.println(Thread.currentThread().getName()+" "+money);
}
}
public void run(){
Withdraw();
}
public static void main(String[] args) throws InterruptedException {
Bank b1 = new Bank();
Bank b2 = new Bank();
Bank b3 = new Bank();
Thread t1 = new Thread(b1,"b1");
Thread t2 = new Thread(b2,"b2");
Thread t3 = new Thread(b3,"b3");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("The remaining money is "+money);
}
}
结果为:
b2 2100
b3 2100
b1 2100
b3 1500
b2 1800
b3 900
b1 1200
b2 600
b1 300
The remaining money is 300
相关文章推荐
- java多线程下synchronized修饰static方法与非static方法的区别
- Java中synchronized 修饰在static方法和非static方法的区别
- Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用
- Java语言中synchronized 修饰在 static方法和 非static方法的区别
- 多线程synchronized和synchronized static方法的区别
- 多线程下synchronized修饰static方法与非static方法的区别
- Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用
- java中synchronize关键字的理解 在多线程环境下的应用: synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. syn
- Java语言中synchronized 修饰在 static方法和 非static方法的区别
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
- 多线程下synchronized修饰static方法与非static方法的区别
- Java中static修饰的方法和非static修饰的方法的区别
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解 (r)
- Java中synchronized 修饰在 static方法和 非static方法的区别
- static方法和非static方法的区别(java)
- synchronized 修饰在 static方法和非static方法的区别
- 多线程下synchronized修饰static方法与非static方法的区别
- java多线程-synchronized对象和方法的区别
- static方法和非static方法的区别(java)
- java static块和static方法及static方法和非static方法的区别