如何 攻击网站,嘉兴网站制作建设,搜索引擎网站盈利模式,做二手货车网站线程的同步#xff1a;在编程过程中#xff0c;为了防止多线程访问共享资源时发生冲突#xff0c;Java提供了线程同步机制。所谓同步#xff0c;就是指一个线程等待另一个线程操作完再继续的情况。
线程安全#xff1a;一个类很好地同步以保护它的数据#xff0c;这个类…线程的同步在编程过程中为了防止多线程访问共享资源时发生冲突Java提供了线程同步机制。所谓同步就是指一个线程等待另一个线程操作完再继续的情况。
线程安全一个类很好地同步以保护它的数据这个类就称为线程安全的。
线程不安全多个线程先后更改数据造成某些线程得到的是无效数据。
概念比较抽象通过下面的程序来解释
this.ticket–表达式的结果为ticket的当前值因此每次输出的ticket是当前的票数。但是由输出结果可以看到最后输出的“售票员B卖票.ticket 0”。这就和之前的if(this.ticket 0) 产生了冲突为什么ticket0仍然能进入if循环呢
这就是由于不同步所造成的程序在运行过程中需要完成两步操作
1.判断是否还有票
2.卖票
但是步骤1和2之间出现了延迟。假设现在只剩下最后一张票所有线程几乎同时进入run()方法执行此时if判断条件都满足再执行自减操作就会有错误。这就是线程不同步。
package com.thred;class MyThread implements Runnable {//线程主体类private int ticket 6;Overridepublic void run() {//理解为线程的主方法for(int x 0; x 50; x) {if(this.ticket 0) {//卖票的条件try {Thread.sleep(1000);}catch(InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() 卖票.ticket this.ticket--);//this.ticket--表达式的结果为ticket的当前值}}}
}
public class Test {public static void main(String[] args) {MyThread mt new MyThread();new Thread(mt, 售票员A).start();new Thread(mt, 售票员B).start();new Thread(mt, 售票员C).start();}
}
/*
售票员A卖票.ticket 6
售票员C卖票.ticket 6
售票员B卖票.ticket 5
售票员A卖票.ticket 4
售票员C卖票.ticket 3
售票员B卖票.ticket 2
售票员A卖票.ticket 1
售票员C卖票.ticket 1
售票员B卖票.ticket 0
*/怎么解决线程不同步问题同步代码块同步方法块。解决了不同步问题但是程序执行速度变慢安全性高性能降低了。
目前只是入门只简单的写一下怎么用原理的东西等后面深入学习再补充。
同步代码块使用Synchronized关键字定义的代码块同步时需要设置一个对象锁一般是给当前对象this上锁。
package com.thred;class MyThread implements Runnable {//线程主体类private int ticket 6;Overridepublic void run() {//理解为线程的主方法for(int x 0; x 50; x) {synchronized(this) {//同步代码块if(this.ticket 0) {//卖票的条件try {Thread.sleep(1000);}catch(InterruptedException e) {e.printStackTrace();}
System.out.println(Thread.currentThread().getName() 卖票.ticket this.ticket--);}}}}
}
public class Test {public static void main(String[] args) {MyThread mt new MyThread();new Thread(mt, 售票员A).start();new Thread(mt, 售票员B).start();new Thread(mt, 售票员C).start();}
}
/*
售票员A卖票.ticket 6
售票员A卖票.ticket 5
售票员A卖票.ticket 4
售票员A卖票.ticket 3
售票员A卖票.ticket 2
售票员A卖票.ticket 1
*/
同步方法在一个方法上使用synchronized定义此方法称为同步方法。
package com.thred;class MyThread implements Runnable {//线程主体类private int ticket 6;Overridepublic void run() {//理解为线程的主方法for(int x 0; x 50; x) {this.sale();}}public synchronized void sale() {//同步方法if(this.ticket 0) {//卖票的条件try {Thread.sleep(1000);}catch(InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() 卖票.ticket this.ticket--);}}
}
public class Test {public static void main(String[] args) {MyThread mt new MyThread();new Thread(mt, 售票员B).start();new Thread(mt, 售票员A).start();new Thread(mt, 售票员C).start();}
}
/*
售票员B卖票.ticket 6
售票员B卖票.ticket 5
售票员B卖票.ticket 4
售票员B卖票.ticket 3
售票员B卖票.ticket 2
售票员B卖票.ticket 1
*/