一、多锁多线程
-
概念:
多个线程,每个线程都可以拿到自己指定的锁,分别获得锁之后,执行synchronized方法体的内容。 -
例子:
synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,所以哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock)。当是两个对象时,线程获得的就是两个不同的锁,它们之间是互不影响的。
package com.Thread.Sychronized;
public class many_Thread {
private int state=0;
public synchronized void name(String str) {
try {
if(str.equals("A"))
{
state=100;
System.out.println("A");
Thread.sleep(400);
}
else
{
state=200;
System.out.println("B");
Thread.sleep(200);
}
System.out.println("str: "+str+" state:"+state);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
final many_Thread m1=new many_Thread();
final many_Thread m2=new many_Thread();
Thread t1=new Thread()
{
public void run() {m1.name("A");}
};
Thread t2=new Thread()
{
public void run() {m2.name("B");}
};
;
t1.start();
t2.start();
}
}
运行结果:
A
B
str: B state:200
str: A state:100
总结:两个线程都是同时进行的
相同锁的情况,即在静态方法上加synchronized关键字,表示锁定.class类,类级别的锁(独占.class类)
package com.Thread.Sychronized;
public class many_Thread {
private static int state=0;
public static synchronized void name(String str) {
try {
if(str.equals("A"))
{
state=100;
System.out.println("A");
Thread.sleep(400);
}
else
{
state=200;
System.out.println("B");
Thread.sleep(200);
}
System.out.println("str: "+str+" state:"+state);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
final many_Thread m1=new many_Thread();
final many_Thread m2=new many_Thread();
Thread t1=new Thread()
{
public void run() {m1.name("A");}
};
Thread t2=new Thread()
{
public void run() {m2.name("B");}
};
;
t1.start();
t2.start();
}
}
运行结果:
A
str: A state:100
B
str: B state:200
总结:先执行完线程一再执行线程二