java 多線程之Sychronization的三種使用情況
1.同步代碼塊 鎖對象可以是任意的對象
2.普通同步方法 鎖對象預設是是 this
3.靜态同步方法 鎖對象是目前類的class對象
測試這三種情況下的鎖對象 如下:
主類
package Sychronization;
/**
* 測試類
* @author feige
*/
public class SychronizationDemo {
public static void main(String[] args) {
MyRunnable mr=new MyRunnable();
Thread th1=new Thread(mr,"阿飛");
Thread th2=new Thread(mr,"阿瑞");
Thread th3=new Thread(mr,"靳楊");
th1.start();
th2.start();
th3.start();
}
}
同步代碼塊的MyRunnable類 :
package Sychronization;
public class MyRunnable implements Runnable {
//定義全局變量
private static int ticket=1000;
private Object obj=new Object();
private int x=1;
@Override
public void run() {
while(true){
if(x%2==0){
synchronized(obj){//obj 同步鎖必須鎖住的是同一個對象
if(ticket>0){
x++;
System.out.println(Thread.currentThread().getName()+":"+ticket--);
}
}
}
else{
synchronized(obj){//obj 同步鎖必須鎖住的是同一個對象
if(ticket>0){
x++;
System.out.println(Thread.currentThread().getName()+":"+ticket--);
}
}
}
}
}
}
普通同步方法的MyRunnable類 :
package Sychronization;
public class MyRunnable implements Runnable {
//定義全局變量
private static int ticket=1000;
private Object obj=new Object();
private int x=1;
@Override
public void run() {
while(true){
if(x%2==0){
synchronized(this){
if(ticket>0){
x++;
System.out.println(Thread.currentThread().getName()+":"+ticket--);
}
}
}
else{
show();
}
}
}
public synchronized void show(){
if(ticket>0){
x++;
System.out.println(Thread.currentThread().getName()+":"+ticket--);
}
}
}
靜态同步方法的MyRunnable類 :
package Sychronization;
public class MyRunnable implements Runnable {
//定義全局變量
private static int ticket=1000;
private Object obj=new Object();
private static int x=1;
@Override
public void run() {
while(true){
if(x%2==0){
synchronized(MyRunnable.class){
if(ticket>0){
x++;
System.out.println(Thread.currentThread().getName()+":"+ticket--);
}
}
}
else{
show();
}
}
}
public static synchronized void show(){
if(ticket>0){
x++;
System.out.println(Thread.currentThread().getName()+":"+ticket--);
}
}
}