• Java 线程同步、死锁


    线程同步(保证线程安全:没有锁的线程只能等)获取锁 释放锁 运行慢

    public class ThreadDemo { //买门票例子

    public static void main(String[] args) {

    MyTicket mt= new MyTicket(); //创建任务 /MyTicket2

    Thread t1  = new Thread(mt); //创建线程  执行同一个任务

    Thread t2  = new Thread(mt); //查询安全   修改不安全

    t1.start();

    t2.start();

    }

    }

    public class MyTicket implements Runnable{

    private int ticket=100;

    private Lock lock =new ReentrantLock();//创建Look接口实现对象

    private Object obj=new Object();//锁对象 全局变量 线程共用一把锁

    public void run() {

    while(true){//线程带着锁对象(obj)走,走完把锁放回

    synchronized(obj){//同步代码块 //lock.lock();//获取锁

     if(ticket>0){ //其他线程拿不到锁 进不来

    Thread.sleep(50); //try...catch

    System.out.print(Thread.currentThread().getName())

    System.out.println(+""+ticket--);//先打印 后减一

    }

    } //同步代码块 //lock.unlock();//释放锁

    }

    }

    }

    //同步方法锁 任务类

    public class MyTicket2 implements Runnable{

    private int ticket=100;  //static  静态变量

    public synchronized void sile(){//同步方法锁对象(this) :StringBuffer

    if(ticket>0){ //static 静态同步方法  锁对象(类名.class)本类对象

    Thread.sleep(50); //当前类的字节码对象

    System.out.println(Thread.currentThread().getName())

    System.out.println(+""+ticket--+"");//先打印 后减一

    }

    }

    public void run() {

    while(true){ sile(); }

    }

    }

     // 高并发(多人同时访问)解决:加服务器  项目拆分

    死锁:(多线程之间的同步嵌套时,两个线程互相等待)  避免

    public class MyLock {

    public static final Object lockA = new Object();

     

    public static final Object lockB = new Object();

    }

    public class DeadLock implements Runnable {

    private int x=0;

    public void run() {

    while(true){

    if (x%2 ==0) {

    synchronized (MyLock.lockA) {

    System.out.println("if-LockA");

    synchronized (MyLock.lockB) {

    System.out.println("if-LockB"); 

    }

    }

    } else{

    synchronized (MyLock.lockB) { 

    System.out.println("else-LockB"); 

    synchronized (MyLock.lockA) { 

    System.out.println("else-LockA"); 

    }

    }

    x++;

    }

    }

    }

    public class Demo01 {

    public static void main(String[] args) {

    DeadLock dl=new DeadLock();

    Thread t0=new Thread(dl);

    Thread t1=new Thread(dl);

    t0.start();

    t1.start();

    }

    }

  • 相关阅读:
    提示35. 怎样实现OfTypeOnly<TEntity>()这样的写法
    (翻译)Entity Framework技巧系列之十
    Entity Framework教程(第二版)
    实战 ASP.NET Web API
    Apache,PHP,MySQL的安装,配置
    Apache配置虚拟目录和多主机头
    web.config配置详细说明
    百度UEditor编辑器使用教程与使用方法
    若要调试此模块,请将其项目生成配置更改为“调试”模式。若要取消显示此消息,请禁用“启动时若没有用户代码则发出警告”调试器选项
    jquery筛选器
  • 原文地址:https://www.cnblogs.com/javscr/p/10251041.html
Copyright © 2020-2023  润新知