一、加互斥锁Synchronized,保证线程的原子性(多个线程访问的对象的非static方法)
博客专区 > LYQ1990 的博客 > 博客详情
一、加互斥锁Synchronized,保证线程的原子性(多个线程访问的对象的非static方法)
LYQ1990 发表于2年前
一、加互斥锁Synchronized,保证线程的原子性(多个线程访问的对象的非static方法)
  • 发表于 2年前
  • 阅读 213
  • 收藏 4
  • 点赞 2
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

 

多个线程同时访问同一个资源----在同一个资源上,加互斥锁Synchronized,保证线程的原子性,在第一个线程代码全部执行结束,再开始执行第二个线程

说明:Outputer类只new了一次线程一和线程二用的是同一个outputer,锁的是同一个对象。否则即使加锁,也无法达到原子性。

 

********************************************************************

线程一:用Outputer类的output方法,打印“张三吃饭”

线程二:用Outputer类的output方法,打印“李四打游戏”

****************如果不加线程锁,会出现类似下面的结果**************

张三李四打游戏

吃饭

***********************解决方法如下********************************

方法一:在Outputer类的output方法,用this给类对象加锁synchronized (this)

 

注明:【不行的方法: 给output方法的参数加锁synchronized (name),第一个线程的name和第二个线程的name不是同一个】

方法二:在Outputer类,定义一个变量,给这个变量加锁

 class Outputer{

    String tempSysch="";

    public void output(String name){

     synchronized (tempSysch) {}

  }

方法三:在Outputer类的output方法上加锁

public synchronized void output(String name) {}

******************************************************************

 

--------------------------------代码如下----------------------

public class TraditionalThreadSynchronized {

  public static void main(String[] args) {
    TraditionalThreadSynchronized th = new TraditionalThreadSynchronized();
    th.init();
  }

  private void init() {
    final Outputer outputer = new Outputer();
    // 线程一:用Outputer类打印“张三吃饭”
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (true) {
          outputer.output("张三吃饭");
        }
      }
    }).start();
    // 线程二:用Outputer类打印“李四打游戏”
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (true) {
          outputer.output2("李四打游戏");
        }
      }
    }).start();
  }

  // Outputer类
  class Outputer {
    // synchronized修饰对象
    public void output(String name) {
      synchronized (this) {
        // synchronized (name) {
        for (int i = 0; i < name.length(); i++) {
          System.out.print(name.charAt(i));
        }
        System.out.println();
      }
    }

    // synchronized修饰方法
    public synchronized void output2(String name) {
      for (int i = 0; i < name.length(); i++) {
        System.out.print(name.charAt(i));
      }
      System.out.println();
    }
  }
}
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 6
博文 200
码字总数 183254
×
LYQ1990
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: