\ 关于业务逻辑 我是否需要synchronized 方法 困惑?

2019-03-25 13:36|来源: 网路




比如 销售量 不能超销售计划数量执行
每次做销售订单是都需要去判断 计划数量是否执行完成 如果执行完成就不能在继续做销售订单
现在我处理是这样的

boolean checkAmount(){

}

synchronized checkAndSaveOrders(Order order){
if(checkAmount){
  save(order);
}
}

在多线程环境下 不知道是否合理

synchronized 会带来性能损耗

不知道有无其他代替方法?

好的设计思路

相关问答

更多
  • 在PHPUnit中,您可以模拟受保护的方法或创建子类,这些子类将公开私有方法,如closeEnrollments(),从而允许您创建存根以进行测试 - 请参阅http://phpunit.de/manual/3.7/en/test-doubles.html更多。 但是我建议你改进你的架构并研究TDD,SOLID,洋葱架构等概念。这些只是DDD等高级概念的核心概念(及其组件,如Value对象,实体,存储库,服务等) 。 例如。 在您的示例中,类Program提供持久性,验证,一些其他业务逻辑,并且同时是聚合根 ...
  • synchronized关键字是关于不同的线程读取和写入相同的变量,对象和资源。 这不是Java一个微不足道的话题,但这里是Sun的引用: synchronized方法可以实现一个简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。 在一个非常非常小的概念中:当你有两个正在读取和写入相同“资源”的线程时,说一个名为foo的变量,你需要确保这些线程以原子的方式访问变量。 没有synchronized关键字,你的线程1可能看不到更改线程2为 ...
  • 您正在使用两个不同的锁 - 一个用于保护inc1 ,另一个用于保护inc2 。 这意味着线程X可以运行inc1而另一个线程正在运行inc2 。 如果他们使用相同的锁(无论是this还是不同的锁对象),你将无法同时运行它们。 因此,至少在理论上,拥有两个不同的锁应该可以提高您在这种情况下的性能。 You are using two different locks - one to protect inc1 and a different one to protect inc2. This means that ...
  • 同步实例方法相当于 public void m1() { synchronized(this) { ... } } (嗯,它们并不完全相同,但你的问题的答案并没有受到这种差异的影响)。 同步静态方法在类上同步: public void m2() { synchronized(MyClass.class) { ... } } 如您所见,两个块在差异对象上同步: m1在调用它的实例上同步, m2在Class的实例上同步,它表示 ...
  • notify()唤醒在同一对象上调用wait()的第一个线程。 class ThreadB extends Thread{ int total; @Override public void run(){ synchronized(this){ for(int i=0; i<100 ; i++){ total += i; } notify(); } } 像上面的例子,我们使用notify发送信息消息(嘿,我完成了我的工作 ...
  • 锁确实一次只允许一个线程,但不同的锁不会相互影响。 在您的示例中,您有两个锁 - 一个在属于a的互斥锁上,另一个在属于此的互斥锁上(当您使用synchronized关键字时,这是隐含的,正如您在帖子中正确提到的那样)。 因此,对addB()调用将被同步,但不会阻止对任何其他方法的调用。 如果一个线程持有锁定,另一个线程可以保持锁定,而多个其他线程可以同时执行addC()和addD() 。 编辑 : AtomicInteger如果您真的使用Integer ,您可能有兴趣了解AtomicInteger类。 它们 ...
  • actBusy()本身不是同步的,但调用者方法是。 因此,线程1不会因为它获取this对象上的锁而阻塞,并且其他线程不会锁定this对象,因此它可以毫无问题地调用它。 这是因为non-static synchronized方法锁定了当前实例而不是class对象。 xa()获取当前实例的锁,即x并且没有其他线程将能够输入x方法a() ,直到当前线程释放锁。 线程1 - > xa() //acquires lock and holds it 线程2 ---> xa() //blocks here until T ...
  • synchronized的签名(由AnyRef声明)是 final def synchronized[T0](arg0: => T0): T0 如果你用它 override def isEmpty: Boolean = synchronized { super.isEmpty } 然后你把它留给编译器来推断传递给synchronized的函数的返回类型(这里是Boolean )。 如果你用它 override def push(elem: A): this.type = synchronized[thi ...
  • 我通常在我的应用程序中构建一个服务层来处理业务逻辑,它与我的数据访问层通信以保留任何数据。 public class JobService : IJobService { private readonly IJobRepository _jobRepository; public JobService(IJobRepository jobRepository) { _jobRepository = jobRepository; } public I ...
  • 最后两个片段是等效的,但第一个片段不是。 在第一个片段中,假设列表中的添加不是synchronized块的一部分,则两个线程可以同时执行该指令。 如果列表不是线程安全的,那么这是一个问题。 即使列表是线程安全的,它也可能是一个问题,因为状态的各个部分(计数,姓氏和列表)的更改不是原子的。 因此,其他线程可能会看到姓氏的新值,但在列表中找不到此姓氏。 The two last snippets are equivalent, but the first one is not. In the first sni ...