synchornized常用的方法的对比。
一 给静态方法和普通方法加锁
加锁的类
public class LockText {
public synchronized void printCount(){
int i=0;
while(i<50){
System.out.println(Thread.currentThread()+"ynt---"+i);
i++;
}
}
public synchronized void printString(){
int i=0;
while(i<50){
System.out.println(Thread.currentThread()+"ynt===");
i++;
}
}
public synchronized static void printChar(){
char xx=65;
int i=65;
while(i<91){
System.out.println(Thread.currentThread()+"ynt++++"+xx);
xx++;
i++;
}
}
}
调用类
public class MainText {
public static void main(String[] args) {
// TODO Auto-generated method stub
final LockText text=new LockText();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
text.printCount();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
text.printString();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
LockText.printChar();
}
}).start();
}
}
运行结果部分截图
Thread[Thread-0,5,main]ynt---42
Thread[Thread-2,5,main]ynt++++W
Thread[Thread-0,5,main]ynt---43
Thread[Thread-2,5,main]ynt++++X
Thread[Thread-0,5,main]ynt---44
Thread[Thread-2,5,main]ynt++++Y
Thread[Thread-0,5,main]ynt---45
Thread[Thread-2,5,main]ynt++++Z
Thread[Thread-0,5,main]ynt---46
Thread[Thread-0,5,main]ynt---47
Thread[Thread-0,5,main]ynt---48
Thread[Thread-0,5,main]ynt---49
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
结论:
1.对不同的非静态方法加锁,不能同时访问
2.对静态方法和非静态方法同时加锁,可同时访问
二 对类加锁
加锁类
public class LockText {
public void printCount(){
int i=0;
while(i<50){
System.out.println(Thread.currentThread()+"ynt---"+i);
i++;
}
}
public void printString(){
int i=0;
while(i<50){
System.out.println(Thread.currentThread()+"ynt===");
i++;
}
}
public static void printChar(){
char xx=65;
int i=65;
while(i<91){
System.out.println(Thread.currentThread()+"ynt++++"+xx);
xx++;
i++;
}
}
}
调用类
public class MainText {
public static void main(String[] args) {
// TODO Auto-generated method stub
final LockText text=new LockText();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (LockText.class) {
text.printCount();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (LockText.class) {
text.printString();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (LockText.class) {
LockText.printChar();
}
}
}).start();
}
}
部分运行结果
Thread[Thread-0,5,main]ynt---45
Thread[Thread-0,5,main]ynt---46
Thread[Thread-0,5,main]ynt---47
Thread[Thread-0,5,main]ynt---48
Thread[Thread-0,5,main]ynt---49
Thread[Thread-2,5,main]ynt++++A
Thread[Thread-2,5,main]ynt++++B
Thread[Thread-2,5,main]ynt++++C
Thread[Thread-2,5,main]ynt++++D
Thread[Thread-2,5,main]ynt++++E
Thread[Thread-2,5,main]ynt++++F
Thread[Thread-2,5,main]ynt++++G
Thread[Thread-2,5,main]ynt++++H
Thread[Thread-2,5,main]ynt++++I
Thread[Thread-2,5,main]ynt++++J
Thread[Thread-2,5,main]ynt++++K
Thread[Thread-2,5,main]ynt++++L
Thread[Thread-2,5,main]ynt++++M
Thread[Thread-2,5,main]ynt++++N
Thread[Thread-2,5,main]ynt++++O
Thread[Thread-2,5,main]ynt++++P
Thread[Thread-2,5,main]ynt++++Q
Thread[Thread-2,5,main]ynt++++R
Thread[Thread-2,5,main]ynt++++S
Thread[Thread-2,5,main]ynt++++T
Thread[Thread-2,5,main]ynt++++U
Thread[Thread-2,5,main]ynt++++V
Thread[Thread-2,5,main]ynt++++W
Thread[Thread-2,5,main]ynt++++X
Thread[Thread-2,5,main]ynt++++Y
Thread[Thread-2,5,main]ynt++++Z
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5
结论
对类加锁静态方法和非静态方法都是同步的
三 对对象加锁
加锁类同二
调用类
public class MainText {
public static void main(String[] args) {
// TODO Auto-generated method stub
final LockText text=new LockText();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (text) {
text.printCount();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (text) {
text.printString();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (text) {
LockText.printChar();
}
}
}).start();
}
}
运行结果
运行结果同二
结论:静态方法和非静态方法是同步的
四 简单的 加锁对象加锁类
加锁类同上
public class MainText {
public static void main(String[] args) {
// TODO Auto-generated method stub
final LockText text=new LockText();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (LockText.class) {
text.printCount();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (text) {
text.printString();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (text) {
LockText.printChar();
}
}
}).start();
}
}
运行结果
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---45
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---46
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---47
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---48
Thread[Thread-1,5,main]ynt===
Thread[Thread-0,5,main]ynt---49
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-1,5,main]ynt===
Thread[Thread-2,5,main]ynt++++A
Thread[Thread-2,5,main]ynt++++B
Thread[Thread-2,5,main]ynt++++C
Thread[Thread-2,5,main]ynt++++D
Thread[Thread-2,5,main]ynt++++E
Thread[Thread-2,5,main]ynt++++F
Thread[Thread-2,5,main]ynt++++G
Thread[Thread-2,5,main]ynt++++H
Thread[Thread-2,5,main]ynt++++I
结论 对象锁和类锁不同步
所以对synchronized总结如下:
1.synchronized加到对象上只能锁对象,不同的对象锁不相同因此不同步(代码没贴)
2.synchronized加到类上锁定当前类,静态方法和非静态方法都同步
3.synchronized加到类的不同非静态方法上,方法同步
4.synchronized加到类的静态方法和非静态方法上,他们不同步