zoukankan      html  css  js  c++  java
  • 解决线程安全的方式

    1. 同步代码块

     1 package cn.itcast.day_05.test_02;
     2 
     3 public class RunnableImpl implements Runnable{
     4 
     5     private int tickets = 100;
     6 
     7     //创建对象
     8     Object obj = new Object();
     9 
    10     //设置线程任务
    11     @Override
    12     public void run() {
    13         //票存在,卖票
    14         while (true){
    15             synchronized (obj){  //同步代码块
    16                 if (tickets > 0){
    17                     //提高安全性
    18                     try {
    19                         Thread.sleep(1000);
    20                     } catch (InterruptedException e) {
    21                         e.printStackTrace();
    22                     }
    23                     System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
    24                     tickets--;
    25                 }
    26             }
    27         }
    28     }
    29 }

    2. 同步方法

     1 package cn.itcast.day_05.test_02;
     2 
     3 public class RunnableImpl2 implements Runnable{
     4 
     5     private int tickets = 100;
     6 
     7     @Override
     8     public void run() {
     9         while (true){
    10             payTickets();
    11         }
    12     }
    13 
    14     //静态同步方法
    15     public synchronized void payTickets(){
    16         if (tickets > 0){
    17             try {
    18                 Thread.sleep(1000);
    19             } catch (InterruptedException e) {
    20                 e.printStackTrace();
    21             }
    22             System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
    23             tickets--;
    24         }
    25     }
    26 }

    3. 静态同步方法

     1 package cn.itcast.day_05.test_02;
     2 
     3 public class RunnableImpl2 implements Runnable{
     4 
     5     private static int tickets = 100;
     6 
     7     @Override
     8     public void run() {
     9         while (true){
    10             payTickets();
    11         }
    12     }
    13 
    14     //静态同步方法
    15     public static synchronized void payTickets(){
    16         if (tickets > 0){
    17             try {
    18                 Thread.sleep(1000);
    19             } catch (InterruptedException e) {
    20                 e.printStackTrace();
    21             }
    22             System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
    23             tickets--;
    24         }
    25     }
    26 }

     4. Lock锁

     1 package cn.itcast.day_05.test_02;
     2 
     3 import java.util.concurrent.locks.Lock;
     4 import java.util.concurrent.locks.ReentrantLock;
     5 
     6 public class RunnableImpl3 implements Runnable{
     7 
     8     private int tickets = 100;
     9 
    10     //创建ReentrantLock对象
    11     Lock i = new ReentrantLock();
    12 
    13     @Override
    14     public void run() {
    15         while (true){
    16 
    17             //加锁
    18             i.lock();
    19 
    20             if (tickets > 0){
    21                 try {
    22                     Thread.sleep(1000);
    23                     System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
    24                     tickets--;
    25                 } catch (InterruptedException e) {
    26                     e.printStackTrace();
    27                 }finally {   //无论程序是否异常,都会释放锁
    28                     //解锁
    29                     i.unlock();
    30                 }
    31             }
    32         }
    33     }
    34 }

     

  • 相关阅读:
    5.24Java对象流
    6.1Java多线程抢票龟兔赛跑
    5.29把分散的文件合并
    6.2Java静态代理设计模式
    5.31Java多线程继承
    5.31Java多线程开篇>java.thread
    6.1JavaStartThread
    命令行查看java classpath设置
    文本自动与不自动换行
    Tomcat 6 虚拟目录配置方法
  • 原文地址:https://www.cnblogs.com/nnnnbbbb1/p/12973631.html
Copyright © 2011-2022 走看看