1、synchronized ,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
2、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
3、关于参数问题:毕老师在他的视频用到的代码是synchronized (obj),synchronized (this),synchronized (Ticket.class),意思是保证参数的唯一性,才能保证锁的唯一性,才能保证线程的安全
4、而参数问题一般情况下都用this,代表当前类对象,如果同步代码块方法被static化,则用类名.class,其实还是表示当前类- public void run()
- {
- if(flag)
- {
- while(true)//作循环用
- {
- synchronized(Ticket.class)//this 以后,跟下面的synchronized用同一个锁
- {
- if (ticket>0)
- {
- try{Thread.sleep(10);}catch(Exception e){}
- System.out.println(Thread.currentThread().getName()+"...run.."+ticket--);
- }
- }
- }
- }
- else
- while(true)
- show();
- }
- public static synchronized void show()
- {
- if (ticket>0)
- {
- try{Thread.sleep(10);}catch(Exception e){}
- System.out.println(Thread.currentThread().getName()+"...show.."+ticket--);
- }
- }
复制代码 |