博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发编程之synchronized同步锁锁的是谁
阅读量:6310 次
发布时间:2019-06-22

本文共 1479 字,大约阅读时间需要 4 分钟。

hot3.png

Java并发编程之synchronized同步锁锁的是谁

切记,使用synchronized同步锁,锁的是对象,不是类。

以下代码是一个错误例子:

/** * @Author: StupidZhe * @Date: Created in 2017/11/25 * @Description: 使用synchronized关键词来锁定对象 */public class SyncTest implements Runnable {    private static  int a;    public void print() {        System.out.println(++a);    }    public static void main(String[] args) {        ExecutorService executor = Executors.newCachedThreadPool();        for (int i = 0; i < 5; i++) {            executor.execute(new Thread(new SyncTest()));        }        executor.shutdown();    }    @Override    public void run() {        synchronized (this) {            while (a < 100) {                try {                    Thread.sleep(500);                    print();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}// 挑选了局部输出-------output---------373739404141414243444544

可以看出来同步锁似乎没有成功锁住这段代码。

其实上面的话有问题,同步锁锁住的不是代码,而是对象

听到这句话,大家是否意识到上述的代码的错误之处?问题就出在下面这段代码:

executor.execute(new Thread(new SyncTest()));

在每个线程中都是一个新的Runnable对象,这就导致实际上每个线程运行着不同的对象,而同步锁锁住的是对象,这就出现上述问题。

修改如下:

public static void main(String[] args) {        SyncTest syncTest = new SyncTest();        ExecutorService executor = Executors.newCachedThreadPool();        for (int i = 0; i < 5; i++) {            executor.execute(new Thread(syncTest));        }        executor.shutdown();    }

使用一个对象,就不会出现上述同步锁没锁住的问题。

转载于:https://my.oschina.net/StupidZhe/blog/1579854

你可能感兴趣的文章
copy-paste component
查看>>
CentOS 6.6 新安装系统的网络IP配置
查看>>
解决Spring MVC报No converter found for return value of type:class java.util.ArrayList问题
查看>>
sql语句语法
查看>>
2.1 LibCurl编程流程(转)
查看>>
mysql5.7主从复制
查看>>
Hibernate双向一对一对象关系模型映射
查看>>
elasticsearch-jdbc
查看>>
Linux的#和$区别
查看>>
Linux中ctrl-c, ctrl-z, ctrl-d 区别
查看>>
Hadoop HBase概念学习系列之HLog(二)
查看>>
mysql设置datetime默认值为now
查看>>
R语言获取国内的股票数据
查看>>
Hadoop MapReduce编程 API入门系列之wordcount版本3(七)
查看>>
git命令
查看>>
Scrapy框架实现爬虫
查看>>
sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding...
查看>>
Spring MVC的一些学习笔记-入门配置和HttpMessageConverter
查看>>
RabbitMQ消息队列(二):”Hello, World“
查看>>
Python 图片转字符画
查看>>