java 中提到线程同步,其实有很多种方法,主流方法有3种,synchronized,Lock/ReetenLock,wait->notify机制
今天主要说明对synchronized的理解
首先要明白:java中的资源是指可共享的同一个对象资源(必须要能共享,否则不解释...,必须是同一件资源,否则也不解释...)
同步代码块
sychronized(obj)
{
//这里的obj最好是个类的成员变量或者当前类的对象this,必须是唯一的,可共享的(注:最好不要是静态变量,因为静态的具有全局性,
如果任务多的话,使用多线程,稍有逻辑处理不慎将变成死锁,这和静态同步方法类似)
}
普通同步方法
public synchronized void doTask(){
//这里锁住了 this
}
静态同步方法
public synchronized static void doTask(){
//这里锁住了类的Class,类Class是静态的,共享的资源 Class> thiz;
}
//等价于下面的形式
synchronized(MyClass.class){
}
下面给一个实例
class WorkTask implements Runnable {
private int counter = 100;
private boolean isDoTaskMethod;
public void setDoTaskMethod(boolean isDoTaskMethod)
{
this.isDoTaskMethod = isDoTaskMethod;
}
@Override
public void run() {
while (counter>=0)
{
System.out.println(Thread.currentThread().getName());
synchronized (this) {
counter--;
System.err.println("A==>"+counter);
}
doTask();
}
}
public synchronized void doTask()
{
counter--;
isDoTaskMethod = true;
System.err.println("B==>"+counter);
}
}
public class TestWorkTask {
public static void main(String[] args) {
WorkTask wt = new WorkTask();
Thread t1 = new Thread(wt);
Thread t2 = new Thread(wt);
t1.start();
t2.start();
t1.yield();
}
}