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--);
}
}
}