synchronized同步问题

来源:互联网 发布:进销存软件sobong 编辑:程序博客网 时间:2024/06/15 19:39

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;}@Overridepublic void run() {for (int i = 0; i < 30; i++) {sys.NoSync(ths,i);//两线程一起访问非静态的同步方法,
}}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);//线程1Thread th1=new Thread(rn1);rn1.setTh(th1);th1.start();//启动线程1Runnables rn2=new Runnables(sy);//线程2Thread 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


很显然当一个线程访问同步方法时,其他线程可以访问非同步方法,只有当前一个同步方法执行完后,后一个线程才会去执行要访问的同步方法。




原创粉丝点击