java多个实例对象线程同步无效的原因以及解决方案
2017-08-17 21:58
671 查看
【原因】:synchronized用法没搞清楚
下面就直接举例子了!
【情况1】:单实例对象多线程
【情况2】:多实例对象多线程
【实现效果】:如下图
【总结】:
synchronized(参数){ //注意这个“参数”,如果写this范围是类的一个实例对象,如果写"类名.class"范围是这个类的所有实例对象
//你的代码
}
【更详细的原理说明】:
某个对象实例内,synchronized (this或类名){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线 程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的
synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
某个类的范围,synchronized (类名.class){}防止多个线程同时访问这个类中的synchronized 里面的代码。它可以对类的所有对象实例起作用。
下面就直接举例子了!
【情况1】:单实例对象多线程
public class Demo3 { Tlwindow twd1,twd2,twd3; //定义三个窗口 public static void main(String[] args){ Demo3 demo3=new Demo3(); } public Demo3(){ twd1=new Tlwindow(); Thread t1=new Thread(twd1); Thread t2=new Thread(twd1); Thread t3=new Thread(twd1); t1.start(); t2.start(); t3.start(); } } //卖票窗口类 class Tlwindow implements Runnable{ int num=2000; //假设共有2000张票 //重写run //不断地卖票 public void run(){ while(true){ synchronized(this){ try{ Thread.sleep(1000); }catch(Exception $e){ System.out.println("异常"); } if(this.num>0){ System.out.println(Thread.currentThread().getName()+":当前正在卖"+num+"张票"); num--; }else{ break; } } } } }
【情况2】:多实例对象多线程
public class Demo3 { Tlwindow twd1,twd2,twd3; //定义三个窗口 public static void main(String[] args){ Demo3 demo3=new Demo3(); } public Demo3(){ twd1=new Tlwindow(); twd2=new Tlwindow(); twd3=new Tlwindow(); Thread t1=new Thread(twd1); Thread t2=new Thread(twd2); Thread t3=new Thread(twd3); t1.start(); t2.start(); t3.start(); } } //卖票窗口类 class Tlwindow implements Runnable{ int num=2000; //假设共有2000张票 //重写run //不断地卖票 public void run(){ while(true){ synchronized(Tlwindow.class){ try{ Thread.sleep(1000); }catch(Exception $e){ System.out.println("异常"); } if(this.num>0){ System.out.println(Thread.currentThread().getName()+":当前正在卖"+num+"张票"); num--; }else{ break; } } } } }
【实现效果】:如下图
【总结】:
synchronized(参数){ //注意这个“参数”,如果写this范围是类的一个实例对象,如果写"类名.class"范围是这个类的所有实例对象
//你的代码
}
【更详细的原理说明】:
某个对象实例内,synchronized (this或类名){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线 程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的
synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
某个类的范围,synchronized (类名.class){}防止多个线程同时访问这个类中的synchronized 里面的代码。它可以对类的所有对象实例起作用。
相关文章推荐
- Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信
- java线程同步问题以及解决方案
- java 线程之对象的同步和异步(实例讲解)
- Java线程之锁对象Lock-同步问题更完美的处理方式代码实例
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
- java线程同步机制以及对象锁机制
- Java线程(七):锁对象Lock-同步问题更完美的处理方式
- Java线程同步:synchronized锁住的是代码还是对象
- Java线程同步:synchronized锁住的是代码还是对象
- java线程 在其他对象上同步、线程本地存储ThreadLocal:thinking in java4 21.3.6
- java java.util.ConcurrentModificationException 原因以及解决方案
- Java线程同步:synchronized锁住的是代码还是对象
- java多线程-线程运行状态-获取线程对象以及名称
- Java线程同步:synchronized锁住的是代码还是对象
- Java线程(八):锁对象Lock-同步问题更完美的处理方式
- Java线程(八):锁对象Lock-同步问题更完美的处理方式
- JAVA多线程并发同步,以及线程终止
- 【转】WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变
- Java线程:锁对象Lock-同步问题更完美的处理方式