18.synchronized
同步的前提:
- 必须要有两个或者两个以上的线程
- 必须是多个线程使用同一个锁
- 必须保证同步中只能有一个线程在运行
- 好处:解决了多线程的安全问题
- 弊端:多个线程需要判断锁,较为消耗资源、抢锁的资源。
import java.util.ArrayList;
import java.util.List;
/**
* synchronized 实现线程间的同步,对同步的代码加锁,似的每次只能有一个线程进入同步块
* 可以保证线程间的可见性和有序性
* · 指定加锁对象:对给定对象加锁,进入同步代码前要获取给定对象的锁
* · 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获取当前实例的锁
* · 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获取当前类的锁 -- class文件
*/
public class SynchronizedDemo {
private static int size = 0;
private static List<Integer> arrayOne = new ArrayList<>(10000);
private static List<Integer> arrayTwo = new ArrayList<>(10000);
public static synchronized void increase(){ //synchronized作用于一个实例方法
size++;
}
public static void main(String[] args) throws InterruptedException{
for (int i = 0; i < 10000; i++) {
arrayOne.add(0);
arrayTwo.add(0);
}
Thread threadOne = new Thread(() -> {
int length = arrayOne.size();
for (int i = 0; i < length; i++) {
if (arrayOne.get(i).intValue()==0){
increase();
}
}
});
Thread threadTwo = new Thread(() -> {
int length = arrayTwo.size();
for (int i = 0; i < length; i++) {
if (arrayTwo.get(i).intValue()==0){
increase();
}
}
});
threadOne.start();
threadTwo.start();
threadOne.join();
threadTwo.join();
System.out.println(size);
}
}
import java.util.ArrayList;
import java.util.List;
/**
* Runnable
*/
public class SynchronizedDemo1 {
private static int size = 0;
private static List<Integer> arrayOne = new ArrayList<>(10000);
private static List<Integer> arrayTwo = new ArrayList<>(10000);
public static class AccountSyncBad implements Runnable{
synchronized void increase(){ //synchronized
size++;
}
@Override
public void run() {
int length = arrayOne.size();
for (int i = 0; i < length; i++) {
if (arrayOne.get(i).intValue()==0){
increase();
}
}
}
}
public static void main(String[] args) throws InterruptedException{
for (int i = 0; i < 10000; i++) {
arrayOne.add(0);
arrayTwo.add(0);
}
AccountSyncBad accountSyncBad = new AccountSyncBad();
Thread threadOne = new Thread(accountSyncBad);
Thread threadTwo = new Thread(accountSyncBad);
threadOne.start();
threadTwo.start();
threadOne.join();
threadTwo.join();
System.out.println(size);
}
}
import java.util.ArrayList;
import java.util.List;
/**
* 两个线程指向不同的Runnable实例,这两个线程使用的是两把不同的锁,无法保证线程安全
*/
public class SynchronizedDemo2 {
private static int size = 0;
private static List<Integer> arrayOne = new ArrayList<>(10000);
private static List<Integer> arrayTwo = new ArrayList<>(10000);
public static class AccountSyncBad implements Runnable{
synchronized void increase(){ //synchronized
size++;
}
// static synchronized void increase(){ //修改为static,这样即使两个线程指向不同的Runnable,但请求的是当前类的锁,因此可以正确同步
// size++;
// }
@Override
public void run() {
int length = arrayOne.size();
for (int i = 0; i < length; i++) {
if (arrayOne.get(i).intValue()==0){
increase();
}
}
}
}
public static void main(String[] args) throws InterruptedException{
for (int i = 0; i < 10000; i++) {
arrayOne.add(0);
arrayTwo.add(0);
}
Thread threadOne = new Thread(new AccountSyncBad());
Thread threadTwo = new Thread(new AccountSyncBad());
threadOne.start();
threadTwo.start();
threadOne.join();
threadTwo.join();
System.out.println(size);
}
}
18.synchronized的更多相关文章
- Java多线程5:synchronized锁方法块
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- synchronized锁机制 之 代码块锁(转)
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- java 多线程9 : synchronized锁机制 之 代码块锁
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- java 多线程系列基础篇(四)之 synchronized关键字
1. synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,s ...
- Java多线程(三):Synchronized
多线程安全 脏读:多个线程对同一个对象的实例变量进行修改后访问,导致读到的数据是被修改过的. 实例 ThreadDomain16类 public class ThreadDomain16 { priv ...
- Java关键字(八)——synchronized
synchronized 这个关键字,我相信对于并发编程有一定了解的人,一定会特别熟悉,对于一些可能在多线程环境下可能会有并发问题的代码,或者方法,直接加上synchronized,问题就搞定了. 但 ...
- synchronized锁代码块(七)
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- To Learn
1. Hybrid:Ionic.Cordova.AngularJS等框架 webView,处理H5 2. View.ViewGroup android.view.View public class ...
- java多线程系类:基础篇:04synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
随机推荐
- python已处理的异常
字符串比较中,如果一个字符串有内容,另一个没有内容,python不会报错,而是认为两个字符串不相同如 a=" b="" if a[4:5]==b[4:5]: print( ...
- 在windows的文件添加右键"命令提示符"菜单
1\把以下内容保存为reg文件,然后导入 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\she ...
- js-放大镜效果
jd或者淘宝的具体商品有个放大镜的效果.虽然网上类似插件琳琅满目,应用到项目上有诸多不便,自己抽点时间自己写了个类似插件,积累下代码,何乐而不为呢!!let‘go: 打算把此特效封装成个插件,先把最基 ...
- SQL Server 2008 R2 数据库备份文件.bak如何挂载到【阿里云·独立虚拟主机数据库】上
1.前言 8月份刚刚开始,公司[工作流]挂了,实体服务器会自动重启,数据库死活起不来,这可是计算工资提成的事儿,不能马虎! 在实体服务器中,找到了OA页面源码与数据库的.MDF 与 .LDF 等文件. ...
- JMeter之Beanshell用法
1. 获取JMeter脚本中的变量 ${demoParam} String demo = vars.get("demoParam"); 2. 将数据保存到JMeter脚本中的变量 ...
- POJ 2396 Budget (上下界网络流有源可行流)
转载: http://blog.csdn.net/axuan_k/article/details/47297395 题目描述: 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表 ...
- zenoss(智能监控软件)
Zenoss Core是开源企业级IT管理软件-是智能监控软件,他允许IT管理员依靠单一的WEB控制台来监控网络架构的状态和健康度,同时也是开源的网络与系统管理软件.全名 Zenos ...
- UOJ 418 【集训队作业2018】三角形——思路+线段树合并
题目:http://uoj.ac/problem/418 看了题解才会…… 很好的想法是把整个过程看成若干 “取一点 i ,值+=w[ i ],值-=\(\sum w[j]\)”(其中 j 是 i 的 ...
- HTTP的FormData和Payload的传输格式
FormData和Payload是浏览器传输给接口的两种格式,这两种方式浏览器是通过Content-Type来进行区分的(了解Content-Type),如果是 application/x-www-f ...
- NOIP 历年试题大致考点总结
总的来说,水平还不够-- 要努力了! NOIP2012 D1T1 模拟, 字符串 D1T2 贪心, 数学 (推导贪心策略), 高精度 D1T3 unsolved 开车旅行 倍增 D2T1 解线性模方程 ...