java中多线程安全问题产生&解决方案——同步方法
16lz
2021-01-22
使用同步方法解决
格式:
修饰符synchronized 返回值方法名(){
}
package com.itheima_05;
/*
* 同步方法:使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部锁住,其他线程则无法访问
*
* synchronized
* 注意:
* 非静态同步方法的锁对象是this
* 静态的同步方法的锁对象是当前类的字节码对象
*/
public class TicketThread implements Runnable {
static int tickets = 100;// 火车票数量
Object obj = new Object();
@Override
public void run() {
// 出售火车票
while (true) {
/*synchronized (obj) {
method();
}*/
//method();
method2();
}
}
private synchronized void method() {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
}
private static synchronized void method2() {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
}
}packagecom.itheima_05;
publicclassTicktetTest {
publicstaticvoidmain(String[] args) {
//创建线程对象
TicketThread tt = newTicketThread();
Thread t = newThread(tt);
t.setName("窗口1");
Thread t2 = newThread(tt);
t2.setName("窗口2");
Thread t3 = newThread(tt);
t3.setName("窗口3");
//启动线程对象
t.start();
t2.start();
t3.start();
}
}
更多相关文章
- 本地方法中printf如何传给java--java系统级命名管道
- 为泛型类的泛型方法的属性赋值 - Java
- java线程池使用场景和使用方法较详细文摘
- java的学习方法(转自黑马程序员)
- 是否有缩放因子方法用于Android的多分辨率支持
- Java提高篇——equals()方法和“==”运算符