java-只要线程同步,线程就是安全的,这句话对不对?

问题描述

只要线程同步,线程就是安全的,这句话对不对?

例如一些银行项目里非常重要的方法(操作金额,对金额进行计算之类的),在java里直接用synchronized修饰,那么他就不会出现计算错误的情况了

解决方案

同步了线程就会安全。web工程中每一个浏览器发出的http请求到达服务器的时候,服务器都会建立一个新的线程来处理请求,一般我们写的action中很少会有静态的变量,如果没有静态变量(静态变量都是所有action中唯一的,这些变量属于类,而不是属于某一个实例,也就是说静态变量是实例间共享的),那就不用关心线程安全的问题。如果有静态变量的话,就需要关心线程安全问题了。假设你的类中的方法会对静态变量进行操作。还有一种情况是你的类方法中如果对数据库进行操作的话为了保证操作的原子性则需要在方法上加上关键字synchronized。总结一下,线程如果不涉及到操作公共变量的时候就不要同步,否则就需要同步才能保证线程安全。

解决方案二:

锁也不是可以随便用的,虽然锁能保证并发同步,不至于错误,但如果锁的范围没控制好,不该上锁的部分也上锁了,就可能产生性能问题,你可以想象下,你对整个逻辑接口上锁,那么这么接口必然会以单线程的形式工作,效率一定不及多线程的

解决方案三:

显然不对啊,也可能会出现使用不当导致线程死锁问题的。

时间: 2024-09-01 11:08:18

java-只要线程同步,线程就是安全的,这句话对不对?的相关文章

java线程同步 死锁问题

问题描述 java线程同步 死锁问题 写了一个java中线程同步的死锁问题,但是输出结果就是不对,劳烦前辈指点指点.源代码如下: public class TestDeadLock implements Runnable{ public static int flag = 1; static Object o1 = new Object(); static Object o2 = new Object(); public void run(){ System.out.println(""

Java基础知识回顾--线程

基本概念 线程是一个程序内部的顺序控制流 Java的线程是通过java.lang.Thread类来实现的.main函数是一个主线程,用户可以通过创建Thread的实例来创建新的线程.每一个线程都必须实现run方法.通过Thread类的start方法来启动一个线程. 两种方式实现,一种是线程类实现Runnable接口:二种就是定义一个Thread的子类并重写其run方法. public class TestThread1 { public static void main(String args[

对象-JAVA多线程如何理解这句话?

问题描述 JAVA多线程如何理解这句话? 如何理解"典型地,若将线程类的方法 run() 声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功" 我觉得这句话有问题,这句话中的它应该指的就是run 方法,如果对run方法加锁,是可以调用这个(Thread)类中的其他synchronized修饰的其他方法的,所以我认为这里的第二个"它"应该指的是该Thread类的对象,不知理

Java 线程同步 synchronized

先来看一个不带线程同步的例子,这个例子很简单,只是让两个线程输出同样的内容,并不做其他的事, 所以,线程同步在这里体现的并不明显. import java.util.Date; public class ThreadTest extends Thread{ int pauseTime; String name; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method s

Java线程:线程的同步-同步方法

线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题? 在本文之前,请参阅<Java线程:线程的同步与锁>,本文是在此基础上所写的. 对于同步,在具体的Java代码中需要完成一下两个操作: 把竞争访问的资源标识为private: 同步哪些修改变量的代码,使用synchronized关键字同步方法或代码. 当然这不是唯一控制并发安全的途径. synch

Java线程:线程的同步-同步块

追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能. 在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题. /** * Java线程:线程的同步-同步代码块 * * @author leizhimin */ public class Test { public static void main(String[] args) { User u

Java多线程编程中synchronized线程同步的教程_java

0.关于线程同步 (1)为什么需要同步多线程?线程的同步是指让多个运行的线程在一起良好地协作,达到让多线程按要求合理地占用释放资源.我们采用Java中的同步代码块和同步方法达到这样的目的.比如这样的解决多线程无固定序执行的问题: public class TwoThreadTest { public static void main(String[] args) { Thread th1= new MyThread1(); Thread th2= new MyThread2(); th1.sta

[Java] 线程同步的方法:sychronized、lock、reentrantLock分析

版权声明:请尊重个人劳动成果,转载注明出处,谢谢! 如果你向一个变量写值,而这个变量接下来可能会被另一个线程所读取,或者你从一个变量读值,而它的值可能是前面由另一个线程写入的,此时你就必须使用同步. sychronized  Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码,它是在 软件层面依赖JVM实现同步.  synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁的访问,但却强制所有锁获取和释放均要出现在一

线程-java缓存数据同步问题

问题描述 java缓存数据同步问题 最近在做一个简单的java缓存,线程的主要功能是:查询缓存中是否存在该值,存在则返回,不存在则计算,计算完了将该键值对放到Cache里面.但是这里有个数据同步的问题,可能会有重复计算.即线程1发现不存在该值,去计算,线程2访问同一数据随后也发现不存在该值,去计算.这样就会出现重复计算,请问有没啥办法避免.谢谢大家了! public void run() { Long result = null; InputMsg msg = new InputMsg(num,