前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >带你搞懂Java多线程(三)

带你搞懂Java多线程(三)

作者头像
longzeqiu
发布2020-01-15 15:54:38
2320
发布2020-01-15 15:54:38
举报
文章被收录于专栏:Android小知识Android小知识

带你搞懂Java多线程(一)

带你搞懂Java多线程(二)

什么是线程间的共享

Java支持多个线程同时访问一个对象或一个对象里的成员变量。

线程间共享会存在的问题

  • 当多个线程处理同一块内存区域时,由于对共享内存的操作不是原子操作,会造成语句的执行得不到期望的结果。
代码语言:javascript
复制
public class Test{
    private Object obj = new Object();
    private int count = 0;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    private void add(){
        count++;
    }
}

private static class Count extends Thread{
    private Test test;

    public Count(Test test){
        this.test = test;
    }

    @Override
    public void run() {

        for (int i = 0; i < 1000; i++) {
            test.add();
        }
    }
}

public static void main(String[]args){
    Test test = new Test();
    Count countOne = new Count(test);
    Count countTwo = new Count(test);
    countOne.start();
    countTwo.start();
    Thread.sleep(100);
    System.out.println(test.count);
}

运行结果在1000~2000之间。

synchronized关键字

为了解决上面的问题Java语言内置了synchronized关键字,所以也叫内置锁。

  • 它可以保证同一时刻只有一个线程处于方法或同步块中。 解决上面的问题可以采用如下两种方式,即对象锁
代码语言:javascript
复制
//①锁的是当前对象
 private synchronized void add(){
        count++;
    }
//②锁的是指定对象
 private void add(){
        synchronized(obj){
        count++;
      }
    }
  • 类锁 实际锁的是class对象
代码语言:javascript
复制
private static synchronized void add(){
  count++;
}

其实本质上还是对象锁,只不过类锁是由static关键字修饰的成员变量或方法上,虚拟机中只有一份。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是线程间的共享
    • 线程间共享会存在的问题
      • synchronized关键字
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档