// 线程总结:
/*
* 三种创建方式:
* 什么是线程 : 程序的多个执行路径 ,改变了程序顺序执行的特点,可以多条线共同执行,实际是模拟的并行
* 那么既然是并发,就存在线程安全问题,即同时访问同一份数据
* 因此就要保证要访问的数据的安全性
* 涉及到 锁!!!
* synchronized
* 同步块 (引用类型|.class类|) | 同步方法 加在方法上
* 注意 锁的位置可能影响程序执行的性能,因此要合理的考虑锁添加的位置
*
*/
public class Test02 {
public static void main(String[] args) {
Ticket tic = new Ticket();
// 两个线程同时代理一个对象
// 并且同时读取同一份唯一的资源
Thread t = new Thread(tic);
Thread t2 = new Thread(tic);
t.start();
t2.start();
}
}
class Ticket implements Runnable{
private int num = 20;
public void run(){
while(true){
if(num>0){
System.out.println(num--);
}else {
break;
}
}
}
/*
* 三种创建方式:
* 什么是线程 : 程序的多个执行路径 ,改变了程序顺序执行的特点,可以多条线共同执行,实际是模拟的并行
* 那么既然是并发,就存在线程安全问题,即同时访问同一份数据
* 因此就要保证要访问的数据的安全性
* 涉及到 锁!!!
* synchronized
* 同步块 (引用类型|.class类|) | 同步方法 加在方法上
* 注意 锁的位置可能影响程序执行的性能,因此要合理的考虑锁添加的位置
*
*/
public class Test02 {
public static void main(String[] args) {
Ticket tic = new Ticket();
// 两个线程同时代理一个对象
// 并且同时读取同一份唯一的资源
Thread t = new Thread(tic);
Thread t2 = new Thread(tic);
t.start();
t2.start();
}
}
class Ticket implements Runnable{
private int num = 20;
public void run(){
while(true){
if(num>0){
System.out.println(num--);
}else {
break;
}
}
}
}
在哪里加锁呢?
显然我们可以直接在方法上加锁,但是太傻了,相当于我们在卖票窗口买票,结果在售票大厅加了一把锁,这样效率太低了。
因此我们可以把锁加在方法里,更具体的是循环里。
public void run(){
while(true){
synchronized(this)
if(num>0){
System.out.println(num--);
}else {
break;
}}
这样就可以保证每次只有一个线程能够读取到。
注意:一定要保证同步块中是引用类型,并且其指向不能改变。