1 被synchronized修饰的方法调用了没有被synchronized修饰的方法,是否线程安全?

/**
* (1)被synchronized修饰的方法调用了没有被synchronized修饰的方法,是否线程安全?
* (2)线程安全问题都是由全局变量及静态变量引起的,若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;
* 若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能导致数据不一致
* (3)线程安全是指多个线程在执行同一段代码的时候采用加锁机制,线程不安全就是不提供加锁机制保护
* (4)在下面的例子中,如果method2方法都是通过method1调用的,那么程序执行没有问题,是线程安全的,但是method2也有可能同时被其他的线程调用,可能会对全局变或者静态变量进行修改,所以说method2线程不安全
*/
public class SynchronizedDemo1 { public static void main(String[] args) {
new Thread(() -> {
method1();
}).start(); new Thread(() -> {
method2();
}).start();
} private static synchronized void method1() {
method2();
} private static void method2() {
System.out.println(Thread.currentThread().getName() + "进入非Synchronized方法");
try {
TimeUnit.SECONDS.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "结束非Synchronized方法");
} }

2多个方法同步

/**
* synchronized可以实现方法的同步,a()和b()方法同步了,因为他们使用的是同一的对象
* 总结synchronized和lock的区别
* (1)synchronized关键字不能继承,如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,
* 而必须显式地在子类的这个方法中加上synchronized关键字才可以
* (2)synchronized是jvm内置锁,当获取锁的线程执行完同步代码或者发生异常,jvm会释放锁,两个线程争抢锁的过程中,a获取锁阻塞了,其他线程一直等待,不可中断,非公平锁,可重入,假如不可重入,
* 那么1个类的synchornized方法不能调用本类其他synchornized方法,也不能调用父类中的synchornized方法
* lock锁是显示锁,锁可中断,也可设置锁的等待时长,获取锁后必须手动释放锁,可以是公平锁也可以是非公平锁
*/
public class SynchronizedDemo2 {
public static void main(String[] args) {
People p = new People();
CountDownLatch latch = new CountDownLatch();
Thread a = new MyThread(p, ,latch);
Thread b = new MyThread(p, , latch);
a.start();
b.start();
latch.countDown(); }
} class People { public synchronized void a() {
for (int i = ; i < ; i++) {
System.out.print("A");
try {
Thread.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public synchronized void b() {
for (int i = ; i < ; i++) {
System.out.print("B");
try {
Thread.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
} class MyThread extends Thread {
People p;
int c; CountDownLatch latch;
MyThread(People p, int c ,CountDownLatch latch) {
this.p = p;
this.c = c;
this.latch = latch;
} @Override
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (c == )
p.a();
else if (c == )
p.b();
}
}

3线程不安全的例子

/**
* 多个线程调用pass方法时,会对共享数据name和address发生修改,会造成数据不一致,线程不安全
*/
public class SynchronizedDemo3 { public static void main(String[] args) {
Gate gate = new Gate();
User bj = new User("Baobao", "Beijing", gate);
User sh = new User("ShangLao", "ShangHai", gate);
User gz = new User("GuangLao", "GuangZhou", gate); bj.start();
sh.start();
gz.start();
}
} class Gate {
private int counter = ;
private String name = "Nobody";
private String address = "Nowhere"; public synchronized void pass(String name, String address) {
this.counter++;
this.name = name;
this.address = address;
verify();
} private void verify() {
if (this.name.charAt() != this.address.charAt()) {
System.out.println("*******BROKEN********" + toString());
}
} public String toString() {
return "No." + counter + ":" + name + "," + address;
}
} class User extends Thread { private final String myName; private final String myAddress; private final Gate gate; public User(String myName, String myAddress, Gate gate) {
this.myName = myName;
this.myAddress = myAddress;
this.gate = gate;
} @Override
public void run() {
System.out.println(myName + " BEGIN");
while (true) {
this.gate.pass(myName, myAddress);
}
}
}

被synchronized修饰的方法调用了没有被synchronized修饰的方法,是否是线程安全的更多相关文章

  1. 用juery的ajax方法调用aspx.cs页面中的webmethod方法示例

    juery的ajax调用aspx.cs页面中的webmethod方法:首先在 aspx.cs文件里建一个公开的静态方法,然后加上WebMethod属性,具体实现如下,感兴趣的朋友可以参考下哈,希望对大 ...

  2. vue 父子组件传值以及方法调用,平行组件之间传值以及方法调用大全

    vue项目经常需要组件间的传值以及方法调用,具体场景就不说了,都知道.基本上所有的传值都可以用vuex状态管理来实现,只要在组件内监听vuex就好. vue常用的传值方式以及方法有: 1. 父值传子( ...

  3. 用juery的ajax方法调用aspx.cs页面中的webmethod方法

    首先在 aspx.cs文件里建一个公开的静态方法,然后加上WebMethod属性. 如: [WebMethod] public static string GetUserName() { //.... ...

  4. [Inside HotSpot] Java的方法调用

    1. 方法调用模块入口 Java所有的方法调用都会经过JavaCalls模块.该模块又细分为call_virtual调用虚函数,call_static调用静态函数等.虚函数调用会根据对象类型进行方法决 ...

  5. JVM系列-方法调用的原理

    JVM系列-方法调用的原理 最近重新看了一些JVM方面的笔记和资料,收获颇丰,尤其解决了长久以来心中关于JVM方法管理的一些疑问.下面介绍一下JVM中有关方法调用的知识. 目的 方法调用,目的是选择方 ...

  6. JVM方法调用过程

    JVM方法调用过程 重载和重写 同一个类中,如果出现多个名称相同,并且参数类型相同的方法,将无法通过编译.因此,想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同.这种方法上的联系就是重载 ...

  7. 第164天:js方法调用的四种模式

    js方法调用的四种模式 1.方法调用模式 function Persion() { var name1 = "itcast", age1 = 19, show1 = functio ...

  8. ActionMethod_DMI_动态方法调用

    Action执行的时候并不一定要执行execute方法可以在配置文件中配置Action的时候用method=来指定执行那个方法,也可以在url地址中动态指定(动态方法调用DMI)(推荐) 动态方法调用 ...

  9. 04 JVM是如何执行方法调用的(下)

    虚方法调用 Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用会被编译成 invokeinterface 指令.这两种指令,均属于 Java 虚拟机中的虚 ...

随机推荐

  1. Lambda(二)lambda表达式使用

    Lambda(二)lambda表达式使用 Lambda 表达式组成: /* param list arrow lambda body (o1,o2) -> o1.getColor().Compa ...

  2. 操作系统原理之I/O设备管理(第六章上半部分)

    一.I/O系统的组成 I/O系统不仅包括各种I/O设备,还包括与设备相连的设备控制器,有些系统还配备了专⻔⽤ 于输⼊/输出控制的专⽤计算机,即通道.此外,I/O系统要通过总线与CPU.内存相连. I/ ...

  3. nodejs块级作用域

    现在让我们了解3个关键字var.let.const,的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方声明的,都会提升到当 ...

  4. HTTP Protocol

    HTTP协议 1      HTTP请求状态码 当用户试图通过 HTTP 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码.状态 ...

  5. JOIN中的外连接(external join)

    外连接: ---外连接并不要求连接的两表的每一条记录在对方表中都有一条匹配记录.要保留所有记录(甚至这条记录没有匹配的记录也要保留)的表成为保留表.外连接可以一句连接表保 留左表,右表和全部表的行二进 ...

  6. 起步:SpringBoot

    pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  7. 7、Topic

    Topics In the previous tutorial we improved our logging system. Instead of using a fanout exchange o ...

  8. 3-2-Pandas 索引

    Pandas章节应用的数据可以在以下链接下载:  https://files.cnblogs.com/files/AI-robort/Titanic_Data-master.zip In [4]: i ...

  9. 五、select的5种子句

    1.Where 条件查询 比较运算符: 运算符 说明 >   <   =   >=   <=   !=或<>   In 在某集合内 between 在某范围内 In ...

  10. NVIDIA-SMI参数解析

    第一栏的Fan:N/A是风扇转速,从0到100%之间变动,这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转,可能打不到显示的转速.有的设备不会返回转速,因为它不依赖风扇冷却而是通过其他外设保持低 ...