[03] 线程同步 synchronized
1、线程同步概述
2、synchronized
- 同步方法: 访问权限修饰符 synchronized 数据返回类型 方法名() { ... }
- 同步语句块:synchronized (共享对象名) { ... }
- 不能修饰构造函数、抽象方法、成员变量
//Data 共享数据
public class Data {
private static int count = 0;
public static int getCount() {
return count;
}
public static void add() {
count++;
}
}
//Counter 操作共享数据
public class Counter {
public synchronized void count() {
Data.add();
System.out.println("current count = " + Data.getCount());
}
}
//MyThread
public class MyThread extends Thread {
private Counter counter;
public MyThread(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
for(int i = 0; i < 50; i++) {
counter.count();
}
}
}
//Test
public class Test {
public static void main(String[] args) {
Counter counter1 = new Counter();
Counter counter2 = new Counter();
Thread t1 = new MyThread(counter1);
Thread t2 = new MyThread(counter2);
t1.start();
t2.start();
}
}
//输出结果示例
...
current count = 2
current count = 2
current count = 3
current count = 4
current count = 5
current count = 6
current count = 7
...
x
//Data 共享数据
public class Data {
private static int count = 0;
public static int getCount() {
return count;
}
public static void add() {
count++;
}
}
//Counter 操作共享数据
public class Counter {
public synchronized void count() {
Data.add();
System.out.println("current count = " + Data.getCount());
}
}
//MyThread
public class MyThread extends Thread {
private Counter counter;
public MyThread(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
for(int i = 0; i < 50; i++) {
counter.count();
}
}
}
//Test
public class Test {
public static void main(String[] args) {
Counter counter1 = new Counter();
Counter counter2 = new Counter();
Thread t1 = new MyThread(counter1);
Thread t2 = new MyThread(counter2);
t1.start();
t2.start();
}
}
//输出结果示例
...
current count = 2
current count = 2
current count = 3
current count = 4
current count = 5
current count = 6
current count = 7
...
//Test
public class Test {
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new MyThread(counter);
Thread t2 = new MyThread(counter);
t1.start();
t2.start();
}
}
//输出结果示例
current count = 1
current count = 2
current count = 3
current count = 4
current count = 5
current count = 6
current count = 7
current count = 8
...
//Test
public class Test {
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new MyThread(counter);
Thread t2 = new MyThread(counter);
t1.start();
t2.start();
}
}
//输出结果示例
current count = 1
current count = 2
current count = 3
current count = 4
current count = 5
current count = 6
current count = 7
current count = 8
...
- 只对改变共享资源的地方进行同步,而不是所有方法。同步块越大,多线程的效率也越低
- synchronized 关键字可以修饰方法和代码块,但是不能修饰构造函数、抽象方法、成员变量
- synchronized 关键字无法继承
- synchronized 不论在方法还是对象上,取得的锁都是对象,注意搞清楚锁定的是哪个对象
[03] 线程同步 synchronized的更多相关文章
- Java线程(二):线程同步synchronized和volatile
上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...
- 线程同步 synchronized 同步代码块 同步方法 同步锁
一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...
- 线程同步synchronized,wait,notifyAll 测试示例
https://www.cnblogs.com/LipeiNet/p/6475851.html 一 synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中 ...
- 线程同步synchronized和ReentrantLock
一.线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突. 如下例:假设有一个卖票 ...
- 多线程学习-基础( 九)线程同步Synchronized关键字
一.线程同步1.synchronized关键字的作用域有二种:(1)某个对象实例内:synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果 ...
- Java线程同步synchronized的理解
JVM中(留神:马上讲到的这两个存储区只在JVM内部与物理存储区无关)存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,所有实例和实例的字段都在此区域,对于所有的线程是共享 ...
- java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决
0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...
- Day13_71_线程同步(synchronized)
线程同步 * 异步编程模型和同步编程模拟的区别? - 有T1和T2 两个线程 > 异步编程模型:T1线程执行T1的,T2线程执行T2的,谁也不等谁 > 同步编程模型:T1和T2 线程执行, ...
- C++并发编成 03 线程同步
这一节主要讲讲线程同步的方式,C++ 11中提供了丰富的线程同步元语,如condition_variable,futrue,std::packaged_task<>,std::promis ...
随机推荐
- 如何将web项目部署到weblogic
在Eclipse中配置weblogic11g服务器: 下载并安装Eclipse:www.eclipse.org 下载并安装Weblogic Server Plugin for Eclipse:http ...
- web-worker 的使用
JavaScript采用的是单线程模式,它每次也只能执行一个事件,所以它在加载大量的事件的时候会比较慢. 而web-worker的作用就是给JavaScript提供一个多线程的模式. 注意的是 web ...
- wap2app(十)--wap2app 添加原生底部导航,添加原生标题栏,填坑
一.添加原生标题栏 添加原生标题栏可以参照 <wap2app(六)-- wap2app的原生标题头无法隐藏>,具体如下: 1.打开 sitemap.json文件 --> page配置 ...
- [20190214]11g Query Result Cache RC Latches.txt
[20190214]11g Query Result Cache RC Latches.txt --//昨天我重复链接http://www.pythian.com/blog/oracle-11g-qu ...
- windows下VMware-workstation中安装CentOS
windows下VMware-workstation中安装CentOS,可以分两部分,安装虚拟机和安装CentOS虚拟机.具体步骤如下: 一.安装虚拟机 1.安装VMware-workstation, ...
- EOS与以太坊有哪些区别?
以太坊是一个专门为开发和运行去中心化应用(DAPP)搭建的智能合约平台:EOS与以太坊类似,同样是基于智能合约和区块链而搭建.但是,从技术和设计理念等方面来看,这两者之间实际上存在明显的区别. 那么E ...
- LIGER UI GRID TREE解决打开子树的时候,母树图标全部变成+
1.为data增加Expanded.当打开时告知已打开 关闭时告知已关闭 2.修改ligergrid 如果是打开状态,则open
- 【Teradata UDF】MD5加密
使用参考:Teradata自定义函数UDF(chs_instr) 源码下载:百度网盘链接
- 解决IE8不支持html5标签最好解决办法?
完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法:HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显 ...
- 洛谷P1904
法一,数字太大,可能通过不了 #include <iostream>#include <algorithm>#include <cstdio>using nam ...