今天是 synchronized线程安全
使用方法:
synchronized(监视器){
需要同步的代码
}
监视器:任意实现类的对象 必须要是同一个对象
在实现runnable的接口中,可以用this 作为对象
在继承类的,慎用this,可以用当前类作为监视器
因为实现runnable接口中本身就是共享的,就不用static
而继承的要用static让其同步。
代码如下:
package Thread;
/**
* 创建多线程的方式二:实现runnable接口
* 1.实现runnable接口
* 2.创建一个实现了runnable中的抽象方法:run()
* 3。创建实现类的对象
* 4,将此对象作为参数传递到Thread类的构造器中吗,,创建Thread类的对象
* 5,通过Thread类的对象调用start()
*
*比较创建线程的两种方式。
* 开发中,优先选择,实现runnable接口的方式
*方式一:同步代码块
* synchronized(同步监视器){
* //需要被同步的代码
* }
* 说明:操作共享数据的代码,即需要被同步的代码
* synchronized
*
* 联系:Thread类本身也实现了runnable接口
* 相同点:两种方式都需要重写run(),将线程执行的逻辑声明在run()中
* 同步监视器:俗称:锁 任何一个类的对象都可以充当锁
* 要求:多个线程必须要共用一把锁。
* 补充:在实现runnable接口 可以用this作为对象
* 继承thread类创建多线程方式中,慎用this,可以使用当前类用同步监视器i
* 解决了线程安全问题
* 操作同步代码时,只能有一个线程参与 相当是单线程
*
* @author c
* @create 2021-03-31 20:30
*/
class MThread implements Runnable{
private static int ticket = 100;
private static Object obj = new Object();
//2,实现类去实现runnable中的抽象方法 : run()
public void run() {
while (true){
synchronized (this){//此时的this :唯一的window的对象
if (ticket > 0){
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖票,票号为"+ticket);
ticket --;
}else {
break;}
}
}
}
}
public class ThreadTest1 {
public static void main(String[] args) {
//3创建实现类的对象
MThread mThread = new MThread();
//4.将此对象作为参数传递到Thread类的构造器中,创造Thread类的对象
Thread t1 = new Thread(mThread);
t1.setName("线程一");
//5.通过Thread类的对象调用start() 启动线程 调用run方法 调用了Runnable类型的target
t1.start();
Thread t2 = new Thread(mThread);
t2.setName("线程二");
t2.start();
}
}