您的位置:首页 > 其它

synchronized同步问题

2017-05-16 11:08 127 查看
synchronized线程同步,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

假设现有a,b两线程,abc实例化对象(对象中包含非静态同步块,非静态同步方法,非同步方法,静态同步方法,静态同步代码块),def实例化对象(同上)

1.当两个并发线程同时访问某个实例化对象中的synchronized同步代码块时,一个时间内只能有一个线程访问,一个线程等待,直到第一个线程结束。

2.若两线程中的a正在访问非静态同步方法或者非静态同步代码块时,那么b就只能访问非同步方法。此时线程a访问abc对象的非静态同步方法或者非静态同步代码块获得了一个对象锁,这个对象锁没有解开其他线程就不能访问。

3.此时已知,adc和def是同一类的不同实例对象,其中的代码自然一模一样。假设a和b两线程分别访问adc和def两对象中的静态同步方法或静态同步块,若a线程第一时间访问,那么b线程一样会处于等待状态,直到a线程解锁。

4.总结:当两线程一起访问的是同一个实例化对象中的非静态同步方法时,这个时候的线程锁也可以叫做对象锁。当两线程一起访问的是同一个类的静态同步方法时,这个时候的线程锁叫做类锁。

5.类锁:只要是访问了类中的静态同步块就会获得。这个时候类中的静态同步块只能被一个线程访问
对象锁:只要是访问了类的同一个实例化对象才会获得,这个时候类中的非静态同步块只能被一个线程访问

public class Sync {

public void feiSync(Thread th,int i){//普通方法
System.out.println("普通方法:"+th.getName()+","+i);
}

public synchronized void NoSync(Thread th,int i){//非静态同步方法
System.out.println("非静态同步方法:"+th.getName()+","+i);
}

public static synchronized void YesSync(Thread th,int i){//静态同步方法
System.out.println("静态同步方法:"+th.getName()+","+i);
}
}
class Runnables implements Runnable{

private Sync sys=new Sync();
private Thread ths=new Thread();
public Runnables(Sync sys){
this.sys=sys;
}

@Override
public void run() {
for (int i = 0; i < 30; i++) {
sys.NoSync(ths,i);//两线程一起访问非静态的同步方法,
}

}
4000

public void setTh(Thread th){
this.ths=th;
}

}

public class test {

public static void main(String[] args) {
Sync sy=new Sync();//实例化对象,内含多个同步方法

Runnables rn1=new Runnables(sy);//线程1
Thread th1=new Thread(rn1);
rn1.setTh(th1);
th1.start();//启动线程1

Runnables rn2=new Runnables(sy);//线程2
Thread th2=new Thread(rn2);
rn1.setTh(th2);
th2.start();//启动线程2
}

}

调用NoSync()方法时:输出结果为
非静态同步方法:Thread-2,0
非静态同步方法:Thread-2,1
非静态同步方法:Thread-2,2
非静态同步方法:Thread-2,3
非静态同步方法:Thread-2,4
非静态同步方法:Thread-2,5
非静态同步方法:Thread-2,6
非静态同步方法:Thread-2,7
非静态同步方法:Thread-2,8
非静态同步方法:Thread-2,9
非静态同步方法:Thread-2,10
非静态同步方法:Thread-2,11
非静态同步方法:Thread-2,12
非静态同步方法:Thread-2,13
非静态同步方法:Thread-2,14
非静态同步方法:Thread-2,15
非静态同步方法:Thread-2,16
非静态同步方法:Thread-2,17
非静态同步方法:Thread-2,18
非静态同步方法:Thread-2,19
非静态同步方法:Thread-2,20
非静态同步方法:Thread-2,21
非静态同步方法:Thread-2,22
非静态同步方法:Thread-2,23
非静态同步方法:Thread-2,24
非静态同步方法:Thread-2,25
非静态同步方法:Thread-2,26
非静态同步方法:Thread-2,27
非静态同步方法:Thread-2,28
非静态同步方法:Thread-2,29
非静态同步方法:Thread-3,1
非静态同步方法:Thread-3,2
非静态同步方法:Thread-3,3
非静态同步方法:Thread-3,4
非静态同步方法:Thread-3,5
非静态同步方法:Thread-3,6
非静态同步方法:Thread-3,7
非静态同步方法:Thread-3,8
非静态同步方法:Thread-3,9
非静态同步方法:Thread-3,10
非静态同步方法:Thread-3,11
非静态同步方法:Thread-3,12
非静态同步方法:Thread-3,13
非静态同步方法:Thread-3,14
非静态同步方法:Thread-3,15
非静态同步方法:Thread-3,16
非静态同步方法:Thread-3,17
非静态同步方法:Thread-3,18
非静态同步方法:Thread-3,19
非静态同步方法:Thread-3,20
非静态同步方法:Thread-3,21
非静态同步方法:Thread-3,22
非静态同步方法:Thread-3,23
非静态同步方法:Thread-3,24
非静态同步方法:Thread-3,25
非静态同步方法:Thread-3,26
非静态同步方法:Thread-3,27
非静态同步方法:Thread-3,28
非静态同步方法:Thread-3,29
线程执行的先后顺序是一般优先级。


sys.YesSync(ths,i);
调用同一个实例化对象的YesSync时输出结果为:
静态同步方法:Thread-3,0
静态同步方法:Thread-3,1
静态同步方法:Thread-3,2
静态同步方法:Thread-3,3
静态同步方法:Thread-3,4
静态同步方法:Thread-3,5
静态同步方法:Thread-3,6
静态同步方法:Thread-3,7
静态同步方法:Thread-3,8
静态同步方法:Thread-3,9
静态同步方法:Thread-3,10
静态同步方法:Thread-3,11
静态同步方法:Thread-3,12
静态同步方法:Thread-3,13
静态同步方法:Thread-3,14
静态同步方法:Thread-3,15
静态同步方法:Thread-3,16
静态同步方法:Thread-3,17
静态同步方法:Thread-3,18
静态同步方法:Thread-3,19
静态同步方法:Thread-3,20
静态同步方法:Thread-3,21
静态同步方法:Thread-3,22
静态同步方法:Thread-3,23
静态同步方法:Thread-3,24
静态同步方法:Thread-3,25
静态同步方法:Thread-3,26
静态同步方法:Thread-3,27
静态同步方法:Thread-3,28
静态同步方法:Thread-3,29
静态同步方法:Thread-2,0
静态同步方法:Thread-2,1
静态同步方法:Thread-2,2
静态同步方法:Thread-2,3
静态同步方法:Thread-2,4
静态同步方法:Thread-2,5
静态同步方法:Thread-2,6
静态同步方法:Thread-2,7
静态同步方法:Thread-2,8
静态同步方法:Thread-2,9
静态同步方法:Thread-2,10
静态同步方法:Thread-2,11
静态同步方法:Thread-2,12
静态同步方法:Thread-2,13
静态同步方法:Thread-2,14
静态同步方法:Thread-2,15
静态同步方法:Thread-2,16
静态同步方法:Thread-2,17
静态同步方法:Thread-2,18
静态同步方法:Thread-2,19
静态同步方法:Thread-2,20
静态同步方法:Thread-2,21
静态同步方法:Thread-2,22
静态同步方法:Thread-2,23
静态同步方法:Thread-2,24
静态同步方法:Thread-2,25
静态同步方法:Thread-2,26
静态同步方法:Thread-2,27
静态同步方法:Thread-2,28
静态同步方法:Thread-2,29
显然也会有线程锁。

Sync sy=new Sync();//实例化对象,内含多个同步方法
Sync sy2=new Sync();
当我调用不同实例化对象时输出结果一样:
静态同步方法:Thread-3,0
静态同步方法:Thread-3,1
静态同步方法:Thread-3,2
静态同步方法:Thread-3,3
静态同步方法:Thread-3,4
静态同步方法:Thread-3,5
静态同步方法:Thread-3,6
静态同步方法:Thread-3,7
静态同步方法:Thread-3,8
静态同步方法:Thread-3,9
静态同步方法:Thread-3,10
静态同步方法:Thread-3,11
静态同步方法:Thread-3,12
静态同步方法:Thread-3,13
静态同步方法:Thread-3,14
静态同步方法:Thread-3,15
静态同步方法:Thread-3,16
静态同步方法:Thread-3,17
静态同步方法:Thread-3,18
静态同步方法:Thread-3,19
静态同步方法:Thread-3,20
静态同步方法:Thread-3,21
静态同步方法:Thread-3,22
静态同步方法:Thread-3,23
静态同步方法:Thread-3,24
静态同步方法:Thread-3,25
静态同步方法:Thread-3,26
静态同步方法:Thread-3,27
静态同步方法:Thread-3,28
静态同步方法:Thread-3,29
静态同步方法:Thread-2,0
静态同步方法:Thread-2,1
静态同步方法:Thread-2,2
静态同步方法:Thread-2,3
静态同步方法:Thread-2,4
静态同步方法:Thread-2,5
静态同步方法:Thread-2,6
静态同步方法:Thread-2,7
静态同步方法:Thread-2,8
静态同步方法:Thread-2,9
静态同步方法:Thread-2,10
静态同步方法:Thread-2,11
静态同步方法:Thread-2,12
静态同步方法:Thread-2,13
静态同步方法:Thread-2,14
静态同步方法:Thread-2,15
静态同步方法:Thread-2,16
静态同步方法:Thread-2,17
静态同步方法:Thread-2,18
静态同步方法:Thread-2,19
静态同步方法:Thread-2,20
静态同步方法:Thread-2,21
静态同步方法:Thread-2,22
静态同步方法:Thread-2,23
静态同步方法:Thread-2,24
静态同步方法:Thread-2,25
静态同步方法:Thread-2,26
静态同步方法:Thread-2,27
静态同步方法:Thread-2,28
静态同步方法:Thread-2,29

sys.NoSync(ths,i);
sys.feiSync(ths, i);
当我调用了非synchronized方法时的结果为:
非静态同步方法:Thread-3,0
普通方法:Thread-3,0
非静态同步方法:Thread-3,1
普通方法:Thread-3,1
非静态同步方法:Thread-3,2
普通方法:Thread-3,2
非静态同步方法:Thread-3,3
普通方法:Thread-3,3
非静态同步方法:Thread-3,4
普通方法:Thread-3,4
非静态同步方法:Thread-3,5
普通方法:Thread-3,5
非静态同步方法:Thread-3,6
普通方法:Thread-3,6
非静态同步方法:Thread-3,7
普通方法:Thread-3,7
非静态同步方法:Thread-3,8
普通方法:Thread-3,8
非静态同步方法:Thread-3,9
普通方法:Thread-3,9
非静态同步方法:Thread-3,10
普通方法:Thread-3,10
非静态同步方法:Thread-3,11
普通方法:Thread-3,11
非静态同步方法:Thread-3,12
普通方法:Thread-3,12
非静态同步方法:Thread-3,13
普通方法:Thread-3,13
非静态同步方法:Thread-3,14
普通方法:Thread-3,14
非静态同步方法:Thread-3,15
普通方法:Thread-3,15
非静态同步方法:Thread-3,16
普通方法:Thread-3,16
非静态同步方法:Thread-3,17
普通方法:Thread-3,17
非静态同步方法:Thread-3,18
普通方法:Thread-3,18
非静态同步方法:Thread-3,19
普通方法:Thread-3,19
非静态同步方法:Thread-3,20
普通方法:Thread-3,20
非静态同步方法:Thread-3,21
普通方法:Thread-3,21
非静态同步方法:Thread-3,22
普通方法:Thread-3,22
非静态同步方法:Thread-3,23
普通方法:Thread-3,23
非静态同步方法:Thread-3,24
普通方法:Thread-3,24
非静态同步方法:Thread-2,0
普通方法:Thread-2,0
非静态同步方法:Thread-2,1
普通方法:Thread-2,1
非静态同步方法:Thread-2,2
普通方法:Thread-2,2
非静态同步方法:Thread-2,3
普通方法:Thread-2,3
非静态同步方法:Thread-2,4
普通方法:Thread-2,4
非静态同步方法:Thread-2,5
普通方法:Thread-2,5
非静态同步方法:Thread-2,6
普通方法:Thread-2,6
非静态同步方法:Thread-2,7
普通方法:Thread-2,7
非静态同步方法:Thread-2,8
普通方法:Thread-2,8
非静态同步方法:Thread-2,9
普通方法:Thread-2,9
非静态同步方法:Thread-2,10
普通方法:Thread-2,10
非静态同步方法:Thread-2,11
普通方法:Thread-2,11
非静态同步方法:Thread-2,12
普通方法:Thread-2,12
非静态同步方法:Thread-2,13
普通方法:Thread-2,13
非静态同步方法:Thread-2,14
普通方法:Thread-2,14
非静态同步方法:Thread-2,15
普通方法:Thread-2,15
非静态同步方法:Thread-2,16
普通方法:Thread-2,16
非静态同步方法:Thread-2,17
普通方法:Thread-2,17
非静态同步方法:Thread-2,18
普通方法:Thread-2,18
非静态同步方法:Thread-2,19
普通方法:Thread-2,19
非静态同步方法:Thread-2,20
普通方法:Thread-2,20
非静态同步方法:Thread-2,21
普通方法:Thread-2,21
非静态同步方法:Thread-2,22
普通方法:Thread-2,22
非静态同步方法:Thread-2,23
普通方法:Thread-2,23
非静态同步方法:Thread-2,24
普通方法:Thread-2,24
非静态同步方法:Thread-2,25
普通方法:Thread-2,25
非静态同步方法:Thread-2,26
普通方法:Thread-2,26
非静态同步方法:Thread-2,27
普通方法:Thread-2,27
非静态同步方法:Thread-2,28
普通方法:Thread-2,28
非静态同步方法:Thread-2,29
普通方法:Thread-2,29
非静态同步方法:Thread-3,25
普通方法:Thread-3,25
非静态同步方法:Thread-3,26
普通方法:Thread-3,26
非静态同步方法:Thread-3,27
普通方法:Thread-3,27
非静态同步方法:Thread-3,28
普通方法:Thread-3,28
非静态同步方法:Thread-3,29
普通方法:Thread-3,29

很显然当一个线程访问同步方法时,其他线程可以访问非同步方法,只有当前一个同步方法执行完后,后一个线程才会去执行要访问的同步方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐